在Android中,耐久化存储的办法有三种:文件、SharedPreferences、数据库;前两种办法适用于保存一些简单的数据和键值对,当需要存储很多杂乱的联系型数据的时分,这两种办法就很难应付了。这时分就需要运用到数据库存储了,在Android中运用的是SQLite数据库,这一篇文章,咱们来记录下简单的操作:新建数据库、晋级数据库,和增删改查操作。
- 创立数据库
sqlite供给了一个笼统的帮助类:SQLiteOpenHelper;咱们需要做的就是承继它,并完成两个笼统办法 onCreate(), onUpgrade():
class MySQLiteOpenHelper extend SQLiteOpenHelper {
MySQLiteOpenHelper(Context context, String dbName, SQLiteDatabase.CursorFactory factory, int version) {
super()
}
onCreate () {
//可进行创立表相关逻辑
}
onUpgrade(){
//晋级数据库
}
// 两个重要的实例办法,用于创立/翻开 数据库(假如数据库已存在则直接翻开,
不然创立一个新的数据库),并回来一个可对数据库进行读写操作的对象
SQLiteDatabase getReadableDatabase()
SQLiteDatabase getWritableDatabase()
//这两个办法的差异:
**当数据库不可写入的时分(如磁盘空间已满),getReadableDatabase() 办法
回来的对象将以只读的办法去翻开数据库,而getWritableDatabase() 办法则将出现异常**。
}
所以,通过调用 SQLiteOpenHelper的实例对象的 getReadableDatabase() 或 getWritableDatabase() 办法就可以创立数据库,数据库文件会存放在 /data/data/包名/databases/ 目录下;此刻重写的 onCreate() 办法也会得到履行,一般会在 onCreate() 中做一些创立表的逻辑。
- 晋级数据库
比如在创立数据库并新建BooK表今后,还想在持续增加一个 Category 表,咱们只在 onCreate() 中写上建表办法是不可的,因为此刻数据库已存在,履行getWritableDatabase() 后不会走到onCreate;
此刻需要这么做:
1.在helper类 onCreate 中加上新表的履行; onUpgrade 中 履行onCreate()。(可根据具体情况选择是否运用此办法)
2.新建MySQLiteOpenHelper时,版本号升高
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK); // sql 指令可设置为 “不存在才新建表”
db.execSQL(CREATE_CATEGORY);// sql 指令可设置为 “不存在才新建表”
}
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);
}
// 版本号升高,onUpgrade 才会履行
dbHelper = MySQLiteOpenHelper(this, "BookStore.db", null, 2);// 晋级版本号
- 增加数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
values.put("author", "zhouguoping");
values.put("pages", 100);
values.put("price", 9.9);
db.insert("Book", null, values);
values.clear();
values.put("name", "lisi");
values.put("author", "zhouguoping");
values.put("pages", 120);
values.put("price", 9.98);
db.insert("Book", null, values);
- 更新数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("price", 199.9);
db.update("Book", values, "name = ?", new String[] {"zhangsan"}); //将name为zhangsan 的这本书 的价格更新为 199.9;
– 删去数据
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("Book", "page > ?", new String[] { "110" });//将页数超过110 的数据删去。
查询数据
query() 办法中各参数 | 描绘 | 对应SQL部分 |
---|---|---|
table | 指定查询的表名 | from table_name |
columns | 指定查询的列名 | select column1, column2 |
selection | 指定where 束缚的条件 | where column = value |
selectionArgs | 为where中的占位符供给具体的值 | |
groupBy | 需要指定group by 的列 | group by column |
having | 对group by 后的结果进一步束缚 | having column = value |
orderBy | 指定查询结果的排序办法 | order by column1, column2 |
SQLiteDatabase db = dbHelper.getWritableDatabase();
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"));
} while(cursor.moveToNext());
}
cursor.close();
关于group by 和 orderBy 的了解,可以参阅这篇文章(blog.csdn.net/weixin_4410…
示例
class MySQLiteOpenHelper extend SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table **if not exists** Book ("
+ "id integer primary key autoincrement,"
+ "name text,"
+ "author text,"
+ "price real,"
+ "pages integer)";
public static final String CREATE_CATEGORY = "create table if not exists Category ("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";
MySQLiteOpenHelper(Context context, String dbName, SQLiteDatabase.CursorFactory factory, int version) {
super(context, dbName, factory, version)
}
//假如数据文件已存在,在履行创立数据库办法(getWritableDatabase)时,不会再履行oncreate()
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
}
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);
}
}
class MainActivity {
private MySQLiteOpenHelper dbHelper;
onCreate() {
dbHelper = MySQLiteOpenHelper(this, "BookStore.db", null, 1);
btn.setOnclickListener(
onClick() {
dbHelper.getWritableDatabase();// 创立数据库
}
);
}
}
最后:
adb检查数据库或表数据:
1.运用cd 指令进入/data/data/<包名>/databases/ 目录下,运用ls 指令检查目录下的文件;
2.运用sqlite指令翻开数据库:sqlite3 BookStore.db
3.检查表中数据:select * from Book