介绍
在Android中使用 SQLite, ContentProvider
数据库支持(SQLite) - Android 开发平台提供了操作 SQLite 数据库的相关 API
内容提供器(ContentProvider) - 当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义 URI, 以使其它应用程序可以通过此 URI 访问指定的数据
1、SQLite 的 Demo
DatabaseHelper.java
// TODO 每次成功打开数据库后首先被执行
}
}
Main.java
try {
Random random=new Random();
for (int i=0; i < 3; i++) {
String sql="insert into " + TABLE_NAME
+ " (name, age) values ('name" + String.valueOf(i)
+ "', " + random.nextInt() + ")";
// execSQL() - 执行指定的 sql
db.execSQL(sql);
}
txtMsg.append("成功插入 3 条数据/n");
} catch (SQLException ex) {
txtMsg.append("插入数据失败/n" + ex.toString() + "/n");
}
}
// 删除数据
private void deleteItem() {
try {
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.delete(TABLE_NAME, " id < 999999", null);
txtMsg.append("成功删除数据/n");
} catch (SQLException e) {
txtMsg.append("删除数据失败/n");
}
}
// 更新数据
private void updateItem() {
SQLiteDatabase db=dbHelper.getWritableDatabase();
try {
ContentValues values=new ContentValues();
values.put("name", "批量更新后的名字");
db.update(TABLE_NAME, values, "id<?", new String[] { "3" });
txtMsg.append("成功更新数据/n");
} catch (SQLException e) {
txtMsg.append("更新数据失败/n");
}
}
// 查询数据
private void showItems() {
SQLiteDatabase db=dbHelper.getReadableDatabase();
try {
String[] column={ "id", "name", "age" };
Cursor cursor=db.query(TABLE_NAME, column, null, null, null,
null, null);
Integer num=cursor.getCount();
txtMsg.append("共 " + Integer.toString(num) + " 条记录/n");
cursor.moveToFirst();
while (cursor.getPosition() != cursor.getCount()) {
txtMsg.append(Integer.toString(cursor.getPosition()) + ","
+ String.valueOf(cursor.getString(0)) + ","
+ cursor.getString(1) + ","
+ String.valueOf(cursor.getString(2)) + "/n");
cursor.moveToNext();
}
} catch (SQLException ex) {
txtMsg.append("读取数据失败/n" + ex.toString() + "/n");
}
}
// 删除数据表
private void dropTable() {
SQLiteDatabase db=dbHelper.getWritableDatabase();
String sql="DROP TABLE IF EXISTS " + TABLE_NAME;
try {
db.execSQL(sql);
txtMsg.append("数据表删除成功/n");
} catch (SQLException ex) {
txtMsg.append("数据表删除错误/n" + ex.toString() + "/n");
}
}
}
2、ContentProvider 的 Demo
MyUser.java
// 定义 CONTENT_URI
public static final Uri CONTENT_URI=Uri.parse("content://com.webabcd.MyContentProvider");
// 表数据列
public static final String USER_NAME="USER_NAME";
}
}
MyContentProvider.java
String content;
try {
in=new FileInputStream(file);
int length=(int) file.length();
byte[] buffer=new byte[length];
in.read(buffer, 0, length);
content=EncodingUtils.getString(buffer, "UTF-8");
in.close();
String[] columns=new String[] { MyUser.User._ID, MyUser.User.USER_NAME };
MatrixCursor cur=new MatrixCursor(columns);
String[] values=new String[] { "0", content };
cur.moveToFirst();
cur.addRow(values);
return cur;
} catch (Exception e) {
return null;
}
}
// ContentProvider 的更新数据接口
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
Main.java
// 调用自定义 ContentProvider 的插入接口
private void insertRecord2MyContentProvider(String name) {
ContentValues values=new ContentValues();
values.put(MyUser.User.USER_NAME, name);
getContentResolver().insert(MyUser.User.CONTENT_URI, values);
}
// 调用自定义 ContentProvider 的查询接口
private void displayRecord2MyContentProvider() {
String[] columns=new String[] { MyUser.User.USER_NAME };
Uri uri=MyUser.User.CONTENT_URI;
Cursor cur=managedQuery(uri, columns, null, null, null);
while (cur.getPosition() != cur.getCount()) {
String id=cur.getString(cur.getColumnIndex(People._ID));
String name=cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME));
Toast.makeText(this,
id + " / " + name,
Toast.LENGTH_SHORT).show();
cur.moveToNext();
}
}
}
AndroidManifest.xml
<!--
配置一个自定义的 ContentProvider"
-->
<provider android:name="MyContentProvider" android:authorities="com.webabcd.MyContentProvider" />
</application>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-sdk android:minSdkVersion="3" />
</manifest>