四大组件之ContentProvider-ContentProvider的数据存储
Posted anddlecn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四大组件之ContentProvider-ContentProvider的数据存储相关的知识,希望对你有一定的参考价值。
第4节 ContentProvider的数据存储
ContentProvider
的数据存储经常使用SQL实现,当然也可以采用别的存储机制。
假设这个ContentProvider
需要这样一个数据表:
id | name | price |
---|---|---|
0 | book0 | 15 |
1 | book1 | 13 |
2 | book2 | 18 |
4.1 SQL实现数据存储
4.1.1 创建数据库
android SDK提供了SQLiteOpenHelper
来方便开发者使用SQL数据库。
继承
SQLiteOpenHelper
,创建我们的帮助类,public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
在构造函数中,创建数据库,指定数据库的名字和版本号,
private final static String DB_NAME = "my.db"; private final static int DB_VERSION = 1; public DBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); }
在
onCreate()
函数中,根据前面的表格设计,创建SQL数据表,public final static String TABLE_NAME = "books_table"; @Override public void onCreate(SQLiteDatabase db) { String BOOK_TABLE_CMD = "CREATE TABLE " +TABLE_NAME + "(" + "id" + " INTEGER PRIMARY KEY AUTOINCREMENT," + "name" +" VARCHAR(50)," + "price" + " VARCHAR(50)" + ");" ; db.execSQL(BOOK_TABLE_CMD); }
当数据表的结构发生变化时,需要进行应对原来数据表的升级。这里只是简单的删除以前存在的表格,再重新创建一个表格。在实际的商用软件中,要考虑到数据库表格的变化,把以前老数据表中的数据,逐一转存到新的数据表当中,
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME); onCreate(db); }
/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/
4.1.2 为ContentProvider添加SQL支持
修改MyContentProvider
的增删改查函数,使用数据库实现对数据的操作。
onCreate()
,创建SQL帮助类,private DBHelper mDBHelper; @Override public boolean onCreate() { Log.d(TAG, " onCreate"); mDBHelper = new DBHelper(getContext()); return true; }
insert()
,插入数据,@Override public Uri insert(Uri uri, ContentValues values) { Uri result = null;? switch (sUriMatcher.match(uri)) { case BOOKS: { SQLiteDatabase db = mDBHelper.getWritableDatabase(); long id = db.insert(DBHelper.TABLE_NAME, null, values); if(id > 0) { result = ContentUris.withAppendedId(CONTENT_BOOKS_URI, id); } } break; ...... default: throw new IllegalArgumentException("Unknown URI " + uri); } return result; }
delete()
,删除数据,@Override public int delete(Uri uri, String selection, String[] selectionArgs) { int result = 0; switch (sUriMatcher.match(uri)) { case BOOKS: { SQLiteDatabase db = mDBHelper.getWritableDatabase(); int count = db.delete(DBHelper.TABLE_NAME, selection, selectionArgs); result = count; } break; ...... default: throw new IllegalArgumentException("Unknown URI " + uri); } return result; }
update()
,更新数据,@Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int result = 0; switch (sUriMatcher.match(uri)) { case BOOKS: { SQLiteDatabase db = mDBHelper.getWritableDatabase(); int count = db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs); result = count; } break; ...... default: throw new IllegalArgumentException("Unknown URI " + uri); } return result; }
query()
,查询数据,@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor result = null; switch (sUriMatcher.match(uri)) { case BOOKS: { SQLiteDatabase db = mDBHelper.getReadableDatabase(); Cursor cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); result = cursor; } break; ...... default: throw new IllegalArgumentException("Unknown URI " + uri); } return result; }
SQLiteOpenHelper
可以直接使用ContentProvider
传入的SQL命令,方便开发者灵活的操作数据。
SQLiteOpenHelper
的getReadableDatabase()
获取读取数据库的能力;SQLiteOpenHelper
的getWritableDatabase()
获取写入数据库的能力。
4.2 其他方式的数据存储
除了SQL,还可以使用别的方式存储数据,例如文本文件,甚至链表。
对于不使用SQL的实现方式,query()
函数要返回Cursor
对象,那么可以使用MatrixCursor
,例如,
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Cursor result = null;
switch (sUriMatcher.match(uri)) {
case BOOKS: {
String[] tableCursor = new String[] { "id", "name", "price" };
MatrixCursor cursor = new MatrixCursor(tableCursor);
cursor.addRow(new Object[] { "8", "book8", "23" });
result = cursor;
}
break;
......
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return result;
}
以上是关于四大组件之ContentProvider-ContentProvider的数据存储的主要内容,如果未能解决你的问题,请参考以下文章
四大组件之ContentProvider-轻轻松松自定义ContentProvider
四大组件之ContentProvider-ContentProvider的权限使用和监听
Android面试四大组件之内容提供者ContentProvider
Android基础到进阶四大组件之ContentProvider详解