Android SQLite 使用纪录

写在前面

看完本文你将掌握以下内容

  • 掌握简单 SQL 语法
  • 掌握 SQLite 的简单操作

基础知识

SQL 语法

至于什么是 SQL 是什么,额,自行 Google。。总之强大的 SQL 能帮我完成很多功能,最简单的就是数据库增删改查,对一些要求比较高的功能也是在这四种操作基础之上扩展的。

(这里省略了数据库介绍,我们主要介绍 SQLite 使用,so。。MySQL、SQL Server 介绍等就略过了,相信大家都多多少少了解过)

我这里介绍下最简单的四种操作:

1、SELECT

    SELECT * FROM test; //从 test 数据库中选取所有列内容
    SELECT testid,time FROM test;//从 test 数据库中选取 testid 和 time 列内容
    SELECT testid FROM test;////从 test 数据库中选取 testid 列内容

2、INSERT INTO

 INSERT INTO test (testid, time) VALUES ('1',xxxxxxx);//插入一行数据

3、UPDATE

    UPDATE test  SET time = xxxx WHERE testid='1';//更新testid= '1' 的 time 数据

4、DELETE

  DELETE * FROM test;//删除所有数据
  DELETE FROM test WHERE testid ='2';//删除testid = '2'的行数据

数据的增删改查操作就做一个简单介绍,剩余有需要可以自行深入学习。

SQLite

SQLite 是一个将数据存储到设备上的文本文件的开源SQL数据库,Android 内置了 SQLite 数据库实现,SQLite 支持了关系数据库所有功能,让我们很方便的使用。

Android 中使用数据库所需的 API 在 android.database.sqlite 软件包中提供。

SQLiteOpenHelper

SQLiteOpenHelper 是 Android 中操作数据库重要的类,我们需要继承 SQLiteOpenHelper 类,重写 onCreate() 和 nUpgrade()方法。

例如下面的 TestDBHelper 用于创建数据和检表用,要访问您的数据库,需要实例化 TestDBHelper

TestDBHelper mTestDBHelper = new TestDBHelper(App.getContext());

例如:

public class TestDBHelper extends SQLiteOpenHelper {

private static final int DB_VERSION = 1;
public static final String DB_NAME = "test.db";
public static final String TABLE_NAME = "test";

private static final String COLUMN_ID = "_id";
public static final String COLUMN_ALBUMID = "testid";
public static final String COLUMN_TIME = "time";

public TestDBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    //如果你的建表语句过多,一定要是用 StringBuilder 来拼接语句,使用 "+" 会消耗性能
    StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
    sb.append(TABLE_NAME)
            .append('(')
            .append(COLUMN_ID).append(" INTEGER PRIMARY KEY,")
            .append(COLUMN_ALBUMID).append(" TEXT,")
            .append(COLUMN_TIME).append(" INTEGER")
            .append(')');
    db.execSQL(sb.toString());
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}
}

具体数据类型参考:SQL 数据类型快速参考手册

数据库操作

1、插入数据

通过将一个 ContentValues 对象传递至 insert() 方法将数据插入数据库:

    public void insert(String id,long time) {
        SQLiteDatabase db = null;
        try {
            db = mTestDBHelper.getWritableDatabase();
            db.beginTransaction();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COLUMN_TESTID, id);
            contentValues.put(COLUMN_TIME, time);
            db.insertOrThrow(TABLE_NAME, null, contentValues);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.endTransaction();
            }
        }
    }

insertOrThrow: the row ID of the newly inserted row, or -1 if an error occurred

还可以通过 db.execSQL() 方法执行一条 SQL 语句,这里就不做示范了。

2、读取数据

    public List<NumberModel> getAllData(){
        List<NumberModel> list = null;
        SQLiteDatabase db = mTestDBHelper.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, null, null,null, null, null, null);
        if (cursor == null || cursor.getCount() <= 0){
            Log.e(TAG,"getAllData cursor is null or count <=0");
            return list;
        }
        list = new ArrayList<>();
        while (cursor.moveToNext()){
            NumberModel model = parseNumber(cursor);
            list.add(model);
        }
        Log.d(TAG,"getAllData:"+ list.size() + ",list:" + list);
        return list;
    }

要从数据库中读取信息,请使用 query() 方法,将其传递至选择条件和所需列.

query(
      String table,//表名
      String[] columns,// 返回的所需列
      String selection,// where 条件
      String[] selectionArgs,// where 条件对应的字段
      String groupBy, // 过滤器分组,一半null不分组
      String having,// 过滤器声明要在游标中包含哪些行组,null无分组
      String orderBy// 排序
    )

3、删除数据

    private int deleteById(String id) {
        int count = 0;
        SQLiteDatabase db = null;
        try {
            db = mTestDBHelper.getWritableDatabase();
            db.beginTransaction();

            String whereClause = COLUMN_TESTID + " = ?";
            String[] whereArgs = new String[]{id};
            count = db.delete(TABLE_NAME, whereClause, whereArgs);
            db.setTransactionSuccessful();
            return count;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.endTransaction();
            }
        }
        return count;
    }

delete 还是比较简单的,whereClause 删除条件,whereArgs 删除条件值数组字段(分别对应条件中的 ?)

4、更新数据

    public void update(String id,long time) {
        SQLiteDatabase db = null;
        try {
            db = mTestDBHelper.getWritableDatabase();
            db.beginTransaction();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COLUMN_TESTID, id);
            contentValues.put(COLUMN_TIME, time);
            String whereClause = COLUMN_TESTID + " = ?";
            String[] whereArgs = new String[]{id};
            db.update(TABLE_NAME,contentValues,whereClause,whereArgs);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.endTransaction();
            }
        }
    }

更新操作可将 insert() 的内容值语法与 delete() 的 where 语法相结合

遇到的坑

再项目中遇到和别人公用一个数据库问题,同一个数据库不同的表,起初以为没有什么问题,后来测试就发现某些情况下会找不到数据库表问题,经过分析验证,是有两个 SQLiteOpenHelper,且操作可能不对称,具体异常信息忘记了,后面找到再贴吧,所以,在写数据库相关功能时切记开关数据库,防止发生内存泄露。

总结

简单粗暴的介绍了 SQLite 使用,真正学会使用还需要不断的练习,希望能帮到你。
Github Demo

参考

    原文作者:無名小子的杂货铺
    原文地址: https://www.jianshu.com/p/c966e4a205cc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞