Android数据存储_SQLite数据库存储

Android数据存储的方式有种,主要有三种。分别为:文件存储SharedPreference存储,以及数据库存储。

这篇主要讲SQLite数据库存储。

1.基本描述

        Android自带了一种轻量级数据库SQLite。SQLite是一款轻量级的关系型数据库,他的运算速度非常快,占用资源很少,通常只需要占用几百K的资源就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准SQL语法,还遵循了数据库ACID事务。

        Android为了让我们更加方便的使用管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个帮助类会非常简单的对数据库进行创建和升级。下面我们就通过这帮助类来完成数据库简单的使用。

        文件存储路径 :data/data/包名/databases/**.db

2.代码

2.1MyDatabaseHelper

首先我们自己写一个MyDatabaseHelper继承SQLiteOpenHelper

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private Context mContext;
    public static final String CREATE_BOOK = "create table Book(" +
            "id integer primary key autoincrement," +
            "auther text," +
            "price real," +
            "pages integer," +
            "name text)";

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
        mContext = context;
    }

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
        super(context, name, version, openParams);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

       通过代码可以看出需要重写onCreate()和onUpgrade()两个方法。在onCreate()中创建数据库,在onUpgrade()中升级数据库。

public static final String CREATE_BOOK = "create table Book(" +
        "id integer primary key autoincrement," +
        "auther text," +
        "price real," +
        "pages integer," +
        "name text)";

        这个就是创建一个Book表,里面有几个字段:id、auther、price、pages、name通过onCreate()中的db.execSQL(CREATE_BOOK);创建表。

2.2创建数据库和表

1.当首次进入程序没有创建数据库和表的时候data/data/包名/没有数据库

        我们来创建book表:

myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
create.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        writableDatabase = myDatabaseHelper.getWritableDatabase();
    }
});

同ADM查看:

        确实多了BookStore.db数据库文件,但是还不能确定有没有创建book表,我们把他导出到电脑,使用SQLite Expert Professional 3.exe查看。同时还多了一个db-journal是为了让数据库文件能够支持事务而产生的临时日志文件,通常情况下这个文件的大小是0字节。

        可以清晰的看到了BookStore.db数据库文件里面有两个表,一个是android_metadata,这个是数据库文件都会生成的,另一个Book表就是我们创建的了。

2.3升级数据库

        眼里好的同仁已经看到了MyDatabaseHelper中还重写了onUpgrade()方法。但是没有用到,这个就是升级表的。因为当咱们创建好一本表后再次点击“创建”按钮的时候确实没有弹出“创建成功”,通过ADM查看也没新的数据库和表生成,这是因为当没有这个数据库的时候会调用onCreate()方法创建,当已经创建了就不能再创建了。

        那么怎么才能再次创建呢?这里只是演示,并不能真正在项目中使用

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private Context mContext;
    public static final String CREATE_BOOK = "create table Book(" +
            "id integer primary key autoincrement," +
            "auther text," +
            "price real," +
            "pages integer," +
            "name text)";

    public static final String CREATE_BOOK1 = "create table Book1(" +
            "id integer primary key autoincrement," +
            "auther text," +
            "price real," +
            "pages integer)";

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version, @Nullable DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
        mContext = context;
    }

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name, int version, @NonNull SQLiteDatabase.OpenParams openParams) {
        super(context, name, version, openParams);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_BOOK1);
        Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Book1");
        onCreate(db);
    }
}

通过onUpgrade先把之前的删除在重新创建,只是演示因为删除数据也没了。

同时调用的时候将版本号升序。

myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);

这个时候发现已经多了一张表了Book1.

2.4 插入数据:

add.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ContentValues contentValues = new ContentValues();
        contentValues.put("name", "钢铁是怎样炼成的");
        contentValues.put("pages", 10);
        contentValues.put("price", 9.9);
        contentValues.put("auther", 9.9);
        contentValues.put("auther", "保尔");
        myDatabaseHelper.getWritableDatabase().insert("Book", null, contentValues);
        contentValues.clear();
        contentValues.put("name", "钢铁是这样炼成的");
        contentValues.put("pages", 10);
        contentValues.put("price", 19.9);
        contentValues.put("auther", 9.9);
        contentValues.put("auther", "保尔儿");
        myDatabaseHelper.getWritableDatabase().insert("Book", null, contentValues);
    }
});

2.5 更新数据

updata_data.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ContentValues contentValues = new ContentValues();
        contentValues.put("price", 100);
        myDatabaseHelper.getWritableDatabase().update("Book", contentValues, "name = ?", new String[]{"钢铁是这样炼成的"});
    }
});

2.6 删除数据

del_data.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myDatabaseHelper.getWritableDatabase().delete("Book", "name = ?", new String[]{"钢铁是这样炼成的"});
    }
});

2.7 查询数据

query_data.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Cursor book = myDatabaseHelper.getWritableDatabase().query("Book", null, null, null, null, null, null);
        if (book.moveToFirst()) {
            do {
                String name = book.getString(book.getColumnIndex("name"));
                int pages = book.getInt(book.getColumnIndex("pages"));
                double price = book.getDouble(book.getColumnIndex("price"));
                String auther = book.getString(book.getColumnIndex("auther"));
                Log.d("TAG", "name:" + name +
                        "pages:" + pages +
                        "price:" + price +
                        "auther:" + auther

                );
            } while (book.moveToNext());
        }

    }
});

SQLiteOpenHelper帮助类虽然已经做的很简单了,但是用起来还是有些不方便,比如升级数据库如果用在项目中就需要很复杂的逻辑了,这个时候就会发现一个LitePal一个开源库了,具体再这里。

转发表明出处https://blog.csdn.net/qq_35698774/article/details/106698065

点击下载源码

android互助群:

感谢:郭霖的《第一行代码 第二版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章