第一行代码 第六章 数据储存方案 - SQLite数据库存储

SQLite数据库存储

一、创建数据库
新建一个类,继承SQLiteOpenHelper,并重写onCreate()方法和onUpgrade()方法,分别在这两个方法中去实现创建、升级数据库的逻辑。
SQLiteOpenHelper的构造方法中接收4个参数。
第一个参数是Context
第二个参数是数据库名称
第三个参数是允许我们在查询数据的时候返回一个自定义的cursor,一般传入null即可
第四个参数是当前数据库的版本号,可对数据库进行升级操作。

MyDatabaseHelper.java

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

SQLiteOpenHelper中有两个重要的实例方法:getReadableDatabase()和getWritableDatebase()方法。
这两个方法都可以创建或者打开一个数据库,并返回一个可对数据库进行读写操作的对象(SQLiteDatabase对象)。
不同的是,当数据库不可写入时(如磁盘空间不足),getReadableDatebase()方法返回的对象将以只读的方式去打开数据库;
而getWritableDatebase()方法将出现异常。

数据库文件存放在/data/data//databases目录下

命令行查看数据库文件
adb root
adb remount
adb shell
cd /data/data//databases
sqlite3 数据库名称
.table (查看表名)
select *from 表名;

二、升级数据库
当需要添加新的表时,需要用到onUpgrade()方法。
当传入构造方法的版本号比之前的版本号大,即可触发onUpgrade()方法。
在onUpgrade()方法中执行DROP语句,先检查数据库中是否已经存在表了,如果存在则删除,然后再调用onCreate()方法重新创建。
之所以需要先判断表,是因为如果在创建表时发现这张表已经存在,则会直接报错。

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);
    }

三、数据库操作 – CRUD操作
1、添加数据 – insert()方法
SQLiteDatabase对象中提供了insert()方法,用于添加数据。
该方法接收3个参数:
第一个参数是表名;
第二个参数是用于在未指定添加数据的情况下,给某些可为空的列自动赋值NULL。一般传入null即可。
第三个参数是ContentValues对象,它提供了一系列的put()方法,用于向ContentValues中添加数据。

    private void addData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", "this is sky book");
        values.put("author", "sky");
        values.put("pages", 123);
        values.put("price", 12.3);
        db.insert("Book", null, values);

        values.clear();

        values.put("name", "this is demo book");
        values.put("author", "demo");
        values.put("pages", 456);
        values.put("price", 45.6);
        db.insert("Book", null, values);
    }

需要注意的是:
1)添加的字段一个都不能错,
2)每次装载完后,需要先清空,才能再次装载数据。

2、更新数据 – update()方法
SQLiteDatabase对象中提供了update()方法,用于更新数据。
该方法接收4个参数:
第一个参数是表名;
第二个参数是ContentValues对象,用于要把更新的数据组装到这里。
第三、四个参数是用于约束更新某一行或者某几行中的数据,不指定的话默认就是更新所有行。

    private void updateData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        ContentValues values = new ContentValues();
        values.put("price", 9.9);
        db.update("Book", values, "name=?", new String[]{"this is sky book"});
    }

这里的第三个参数是SQL语句的where部分,表示更新所有name等于?的行,而?是一个占位符,可以通过第四个参数提供。
第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容。

3、删除数据 – delete()方法
SQLiteDatabase对象中提供了delete()方法,用于删除数据。

该方法接收3个参数:
第一个参数是表名;
第二、三个参数是用于约束删除某一行或者某几行中的数据,不指定的话默认就是删除所有行。

    private void deleteData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        db.delete("Book", "name=?", new String[]{"this is sky book"});
    }

4、查询数据 – query()方法
SQLiteDatabase对象中提供了query()方法,用于查询数据。

该方法最短的野有7个参数:
第一个参数是表名;
第二个参数用于指定去查询哪几列,不指定默认查询所有列;
第三、四个参数用于约束查询某一行或某几行的数据,不指定默认查询所有行;
第五个参数用于指定需要去group by 的列,不指定表示不对查询结果进行group by 操作;
第六个参数用于对group by 之后的数据进一步过滤,不指定表示不进行过滤;
第七个参数用于指定查询结果的排序方式,不指定使用默认排序。

该方法会返回一个Cursor对象,查询到的所有数据都将从这个对象中取出。

    private void queryData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        Cursor cursor = db.query("Book",null, null, null, null, null, null);

        if(cursor.moveToFirst()){
            do {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String author = cursor.getString(cursor.getColumnIndex("author"));
                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                double price = cursor.getDouble(cursor.getColumnIndex("price"));
                tvShowData.setText(name + "|"+ author + "|"+ pages + "|"+ price);
            }while (cursor.moveToNext());
        }
        cursor.close();
    }

调用query()方法后,返回Cursor对象。根据Cursor对象中的moveToFirst()方法,将数据的指针移动到第一行的位置,然后进入循环,去遍历每一行的数据。
同Cursor对象中的getColumnIndex()方法,去获取到某一列在表中对应的位置索引,然后将这个索引传入到相应的取值方法中,
这样就从数据库中读取到数据了。


实例:
MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btnCreateDatabase;
    private Button btnUpgradeDatabase;
    private Button btnAddData;
    private Button btnUpdateData;
    private Button btnDeleteData;
    private Button btnQueryData;
    private TextView tvShowData;

    private MyDatabaseHelper databaseHelper;

    private static final String DATABASE_NAME = "BookStore.db";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvShowData = (TextView)findViewById(R.id.tvShowData);
        btnCreateDatabase = (Button)findViewById(R.id.btnCreateDatabase);
        btnUpgradeDatabase = (Button)findViewById(R.id.btnUpgradeDatabase);
        btnAddData = (Button)findViewById(R.id.btnAddData);
        btnUpdateData = (Button)findViewById(R.id.btnUpdateData);
        btnDeleteData = (Button)findViewById(R.id.btnDeleteData);
        btnQueryData = (Button)findViewById(R.id.btnQueryData);

        btnCreateDatabase.setOnClickListener(this);
        btnUpgradeDatabase.setOnClickListener(this);
        btnAddData.setOnClickListener(this);
        btnUpdateData.setOnClickListener(this);
        btnDeleteData.setOnClickListener(this);
        btnQueryData.setOnClickListener(this);

        databaseHelper = new MyDatabaseHelper(this, DATABASE_NAME, null, 2);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnCreateDatabase:
                databaseHelper.getReadableDatabase();
                break;
            case R.id.btnUpgradeDatabase:
                break;
            case R.id.btnAddData:
                addData();
                break;
            case R.id.btnUpdateData:
                updateData();
                break;
            case R.id.btnDeleteData:
                deleteData();
                break;
            case R.id.btnQueryData:
                queryData();
                break;
            default:break;
        }

    }

    private void queryData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        Cursor cursor = db.query("Book",null, null, null, null, null, null);

        if(cursor.moveToFirst()){
            do {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                String author = cursor.getString(cursor.getColumnIndex("author"));
                int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                double price = cursor.getDouble(cursor.getColumnIndex("price"));
                tvShowData.setText(name + "|"+ author + "|"+ pages + "|"+ price);
            }while (cursor.moveToNext());
        }
        cursor.close();
    }

    private void deleteData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        db.delete("Book", "name=?", new String[]{"this is sky book"});
    }

    private void updateData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        ContentValues values = new ContentValues();
        values.put("price", 9.9);
        db.update("Book", values, "name=?", new String[]{"this is sky book"});
    }

    private void addData() {
        SQLiteDatabase db = databaseHelper.getReadableDatabase();
        ContentValues values = new ContentValues();
        values.put("name", "this is sky book");
        values.put("author", "sky");
        values.put("pages", 123);
        values.put("price", 12.3);
        db.insert("Book", null, values);

        values.clear();

        values.put("name", "this is demo book");
        values.put("author", "demo");
        values.put("pages", 456);
        values.put("price", 45.6);
        db.insert("Book", null, values);
    }
}

MyDatabaseHelper.java

public class MyDatabaseHelper extends SQLiteOpenHelper {

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

    public static final String CREATE_CATEGORY = "create table Category (" +
            "id integer primary key autoincrement, " +
            "category_name text, " +
            "category_code integer)";

    private Context mContext;

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        sqLiteDatabase.execSQL(CREATE_CATEGORY);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值