发现不整理自己忘记的非常快…… 先写写吧
文件存储 在第六章也有,但只是一些简单的键值对,shared。。。也是所以就需要数据库 (不过此处大概都是存在本地的哦~)
1.基础知识
(1) SQLiteOpenHelper帮助类,是个抽象类,用的时候继承onCreate() OnUpgrade()。getReadableDatabase() 和getWritableDatabase() 。后者在磁盘已满的时候会异常
(2)构造方法,一般用接受4个那个就好。第一个参数是Context,第二个参数是数据库名,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null 。第四个参数表示当前数据库的版本号。这样就有了
实例,调用上面那两个get方法就可以创建数据库了~~
2.实例
sql建表语句先写出来。此处示范这种:(代码折叠)
create table Book (
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
下面是完整代码。
(1)把建表语句写进了字符串常量,不过!注意加号和引号好多哦,这种作为字符串处理的,字符串声明为final和static
(2)这个helper类的,构造函数~ 看起来是把mContext继承出来啦~ (注意那四个参数的构造参数都是啥)
(3)在onCreate方法里~ 传入SQLiteDataBase对象,对建库语句 execSQL, 就建立完成啦~ (跳出toast提示,toast继承了那个context,然后一句话,然后short)
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)"; 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 db) { db.execSQL(CREATE_BOOK); Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
(4)还没完哦,在xml里添加了Button,在main里还要写几句真的把它实现:
下面1 新建了一个helper实例2 通过构造函数实例化 3 getwirteable。。至此就完成啦~
dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
3.升级数据库
(1)这样呢,在helper类里还是那三步,字符串常量,构造,然后execSQL,但是如果在上一个实验的基础上来,已经建库了就不能再建立,除非卸载。所以就需要update~
但是这样是不好的吧,删除表之后岂不是都没了
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
(2)那我们来百度一下。如何百度呢??
我百度常常是无效的,有谷歌也一样。。那先解析一下,我到底遇到了什么问题?
首先明确,drop是删除了表。搜索drop table if exist,确定这个语句的确是删除了表,和表里的数据;所以感觉是安卓的问题,update只能这么用吗
搜了一下,问了一下群里的大哥,那是偷懒行为……
https://blog.csdn.net/OFY_jiangwushui/article/details/76087659这样完全是可以的。这篇写的非常棒1!!!先不看了,再说吧qwq
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (newVersion) {
case 2:
db.execSQL(CREATE_TEMP_BOOK);
4.增删改查 CURD
调用SQLiteOpenHelper的getReadableDatabase() 或getWritableDatabase() 方法是可以用于创建和升级数据库的 会返回一个SQLiteDatabase 对象
(1)insert() 方法 接收3个参数,第一个参数是表名 第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL ,一般我们用不到这个功能,直接传入null 即可。第三个参数是一个ContentValues 对象,它提供了一系列的put() 方法重载
设置好监听事件之后 helper类先1 建立/2 实例化(构造函数) 3 dbget
4 Contextvalues 5 put 6 insert
SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); // 开始组装第一条数据 values.put("name", "The Da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", 454); values.put("price", 16.96); db.insert("Book", null, values); // 插入第一条数据 values.clear();
。。。。
id那一列并没给它赋值。这是因为在前面创建表的时候,我们就将id 列设置为自增长了,它的值会在入库的时候自动生成,所以不需要手动给它赋值了。
(2)update() 方法,接收4个参数,第一个参数是表名。第二个参数是ContentValues 对象。第三、第四个参数用于约束更新某一行或某几行中的数据,不指定的话默认就是更新所有行。注意占位符!
ContentValues values = new ContentValues();
values.put("price", 10.99);
db.update("Book", values, "name = ?", new String[] { "The Da Vinci
Code" });
(3)SQLiteDatabase 中提供了一个delete() 方法,接收3个参数,第一个参数是表名,第二、第三个参数是用于约束删除某一行或某几行的数据,不指定的话默认就是删除所有行。
(4)query() 方法用于对数据进行查询。这个方法的参数非常复杂,最短的一个方法重载也需要传入7个参数。第一个参数是表名,第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于约束查询某一行或某几行的数据,不指定则默认查询所有行的数据。第五个参数用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作。第六个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。
// 查询Book表中所有的数据
Cursor cursor = db.query("Book", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { // 遍历Cursor对象,取出数据并打印 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")); Log.d("MainActivity", "book name is " + name);//..... } while (cursor.moveToNext()); } cursor.close(); } });