怎么使用安卓的数据库
1得继承SQLiteOpenHelper,继承的类需要重写 :
一个默认构造,onCreate,onUpgrade 。3个方法;
eg: 默认构造
public MyHelper(Context context) {
/*
* 参数1: Context用来确定数据库存储在哪个路径下
* 参数2: 数据库文件的名字
* 参数3: 一个用来创建Cursor(结果集)对象的工厂
* 参数4: 版本号, 用来判断数据库是创建还是升级(降级)
*/
super(context, "lixiang.db" null, 1);
}
eg: onCreate 在数据库创建之后执行
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE person(id Integer PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))"); // 执行SQL语句
}
eg: onUpgrade 在数据库版本升级之后执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE person ADD balance Integer");
}
使用数据库
一般数据库是结合ContentProvider来使用的,ContentProvider是安卓4大组件之一,需要在manifest中进行注册;
<provider
android:name="com.lixiang.sqlite.provider"
android:authorities="IlixiangProvider" />
//authorities这是一个其他应用程序可以访问这个provider的“标识”
同时,我们需要添加一个UriMatcher来跟ContentProvider一起结合使用
public boolean onCreate() {
//获取数据库对象
MyHelper helper = new MyHelper(getContext());
// 创建Uri匹配器(用来识别Uri)
matcher = new UriMatcher(UriMatcher.NO_MATCH);
);
//manifest 中ContentProvider的“标识”、需要操作的表名、匹配号(如果uri匹配上了会返回这个标识,在执行curd4个方法的时候会用到)
matcher.addURI("IlixiangProvider", "person/#", PERSON_ID);
return true;
}
public Uri insert(Uri uri, ContentValues values) {
//matcher.match(uri)会返回一个匹配id
switch (matcher.match(uri)) {
case PERSON:
//打开数据库
SQLiteDatabase db = helper.getWritableDatabase();
// 在values中没有数据的时候, 传null则不插入任何数据
long id = db.insert("person", null, values);
db.close();
// 把id拼接在Uri后面返回
return ContentUris.withAppendedId(uri, id);
default:
throw new IllegalArgumentException("无法识别的Uri: " + uri);
}
}
在另外一个程序中使用ContentProvider
public void testProvider() {
// 获取解析器(访问内容提供者的工具)
ContentResolver resolver = getContext().getContentResolver();
// 指定Uri, 明确要访问哪个内容提供者,IlixiangProvider这里就是manifest 中的那个标识
Uri uri = Uri.parse("content://IlixiangProvider");
ContentValues values = new ContentValues();
// 执行Uri指向的内容提供者中的delete()方法
resolver.delete(uri, null, null);
resolver.query(uri, null, null, null, null);
resolver.update(uri, values, null, null);
resolver.insert(uri, values);
}
监听数据库修改,自动刷新ui界面
eg: ContentProvider刷新代码
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case PERSON:
SQLiteDatabase db = helper.getWritableDatabase();
long id = db.insert("person", null, values);
//这句是刷新界面的核心代码,这个uri也可以自定义,如果自定义的话,在注册监听的时候的uri必须和这里保持一致------------------------------------------
getContext().getContentResolver().notifyChange(uri, null);
//------------------------------------------
db.close();
return ContentUris.withAppendedId(uri, id); // 把id拼接在Uri后面返回
default:
throw new IllegalArgumentException("无法识别的Uri: " + uri);
}
}
eg: 监听UI刷新代码
Uri uri = Uri.parse("content://IlixiangProvider/person");
// 注册观察者(监听器)
getContentResolver().registerContentObserver(uri , true, new ContentObserver(new Handler()) {
public void onChange(boolean selfChange, Uri uri) {
if (selfInsert) { // 判断是否是自己插入的数据
selfInsert = false;
return;
}
list = dao.queryAll(); // 重新查询
adapter.notifyDataSetChanged(); // 刷新界面
}
});
时间: 2024-10-14 21:53:30