Android 原生操作Sqlite数据库常用的API函数

174 阅读3分钟

这里我们牵扯到两个类,第一个是操作数据库的,第二个是操作表的

一、操作数据库类:SqliteOpenHelper

构造方法:SQLiteOpenHelper

public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
        @Nullable CursorFactory factory, int version) {
  • Context context:上下文
  • String name:数据库文件名称
  • int version:数据库的版本

onCreate 方法:用于创建数据库

public abstract void onCreate(SQLiteDatabase db); 
  • SQLiteDatabase db:要创建的数据库
  • 创建数据库的条件
    • 没有数据库。
    • 建立连接的时候。

onUpgrade 方法:用于更新数据库的版本

public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
  • SQLiteDatabase db:数据库
  • int oldVersion :旧的版本
  • int newVersion:新的版本
  • 在调用构造方法的时候,如果新的版本号和上次不一样就会自动调用该方法。可以在该方法里面执行数据库升级语句。

getReadableDatase 方法:获取数据库的连接(读)

public SQLiteDatabase getReadableDatabase()
  • 返回数据库连接对象:SQLiteDatabase
  • 当手机空间不足的时候,添加数据抛出异常

getWritableDatabase 方法:获取数据库的连接(写)

public SQLiteDatabase getWritableDatabase()
  • 返回数据库连接对象:SQLiteDatabase
  • 当手机空间不足的时候,毫无反应

二、数据表操作方法类:SQLiteDatabase

insert:添加数据到数据表中去。

public long insert(String table, String nullColumnHack, ContentValues values)
  • String table:要插入数据的表名称
  • String nullColumnHack:这里可以null
  • ContentValues values:这里是要添加的数据
  • 例如:添加一个name=zhangsan,age=18的数据
ContentValues values = new ContentValues();
values.put("name","zhangsan");
values.put("age",18);
long person = writableDatabase.insert("tableName", null, values);

update:更新数据表的数据

public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
  • String table:要更新数据的表名称
  • String whereClaus:这里是更新的条件
  • String[] whereArgs:这是更新条件对应的值。
  • 例如:更新_id为3的数据,年龄修改为28,其他不变。
ContentValues values = new ContentValues();
values.put("age",28);
writableDatabase.update("tableName",values,"_id=?",new String[]{"1"});

delete:删除数据表的数据

public int delete(String table, String whereClause, String[] whereArgs)
  • String table:要删除数据的表名称
  • String whereClause:删除条件
  • String[] whereArgs:删除条件对应的参数
  • 例如:删除_id=2的数据。
writableDatabase.delete("tableName","_id=?",new String[]{"2"});

query:查询数据表的结果

public Cursor query(boolean distinct, String table, String[] columns,
        String selection, String[] selectionArgs, String groupBy,
        String having, String orderBy, String limit)
  • 案例:其他默认条件的情况下。
Cursor query = readableDatabase.query("tableName", null, null, null, null, null, null);
while (query.moveToNext()) {      //将游标移动到下一条记录的前面
    int nameIndex = query.getColumnIndex("name");  //根据句字段的名称对应查询的下标
    String name = query.getString(nameIndex);  //根据句字段的下标得到对应值
    int ageIndex = query.getColumnIndex("age");
    Integer age = query.getInt(ageIndex);
    Log.d(TAG, "查询的姓名:" + name + ",age = " + age);
}

execSql:执行数据表的操作sql语句

public void execSQL(String sql)
  • String sql:要执行的sql语句。

事务

writableDatabase.beginTransaction();

try {
    writableDatabase.insert("tableName", null, values1);
    Integer a = 10/0;
    writableDatabase.insert("tableName", null, values2);
    writableDatabase.setTransactionSuccessful();
    Log.d(TAG, "数据添加成功");
} catch (Exception e) {
    Log.d(TAG, "数据添加失败:"+e.getMessage());
}finally {
    //结束事务,根据上面的结果,提交或者滚回事务。
    writableDatabase.endTransaction();
}

开启事务

public void beginTransaction()

设置事务为成功

public void setTransactionSuccessful()

结束事务,提交或者回滚

public void endTransaction() 

openDatabase 得到数据库的连接

public static SQLiteDatabase openDatabase(@NonNull String path, @Nullable CursorFactory factory, @DatabaseOpenFlags int flags)

Cursor:查询结果集

匹配查询结果总数据

public int getCount();

将游标移动到下一条记录的前面

public boolean moveToNext();

根据句字段的下标得到对应值

Xxx getXxx(columnIndex);

根据句字段名称得到对应的小标

int getColumnIndex(columnname)