Android数据存储----ContentProvider数据存储

   ContentProvider实现的是数据库操做的封装,而且能够实现数据之间的共享。也就是说,利用ContentProvider实现的数据存储能够在外部应用程序中访问的到。具体过程以下:
java

   一:扩展ContentProvider类提供数据访问接口
android

   扩展SQLiteOpenHelper类,提供数据库表的建立与更新(具体详情请见上一篇博文)数据库

   注:这里建议数据库的表名,列名提取成全局静态常量,以方便后面的调用。ide

   这里建立的数据库为:quan.db。数据库表名为:user。列名有两项,分别为:_id(主键)和title。即
工具

public class MySqlite extends SQLiteOpenHelper {
//数据库表名,列名提取成全局静态常量
    public static final String TABLE_NAME = "user";
    public static final String TABLE_TITLE = "title";
    public static final String TABLE_ID = "_id";
//构造方法
    public MySqlite(Context context) {
        super(context, "quan.db", null, 1);
    }
//数据库表的建立
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + "(" + TABLE_ID
                + " integer primary key autoincrement," + TABLE_TITLE
                + " text not null)");
    }
//数据库表的更新
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

   二:扩展ContentProvider抽象类,实现其中的六个抽象方法,完成对数据库操做的封装
spa

   1:URI简介
xml

   URI统一资源标识符,说白了,就是惟一标识资源的一个字串。一样的在ContentProvider中也须要惟一的一个字符串,标识提供数据的惟一性。也正是根据URI在Manifest.xml文件中的注册,外部应用程序才可能查找获得ContentProvider所提供的数据。对象

   具体的注册方式:
blog

<provider
            android:name="继承自ContentProvider类的类名"
            android:authorities="包名.继承自ContentProvider类的类名" >
</provider>

   具体的URI格式:继承

public static final Uri URI = Uri.parse("content://包名.继承自Contentprovider的类名称(也就是注册中android:authorities的属性值)");

   注意:字符串中“content://”为固定格式。

   2:六个抽象方法及做用

   (1)onCreate():主要用来初始化使用到的工具,在ContentProvider对象建立以后就会被调用。好比继承自SQLiteOpenHelper类的对象的初始化,SQLiteDatabase中得到可读可写权限对象的初始化等。

   (2)query():返回类型为Cursor,经过对数据库具备可读权限对象的query方法,完成外部应用数据库关于表的查询操做。即:提供外部应用的从ContentProvider中获取数据。

   (3)insert():返回类型为Uri,经过对数据库具备可写权限对象的insert方法,完成数据库关于表的插入操做。即外部应用向ContentProvider中插入数据。

   (4)delete():返回类型为int,经过对数据库具备可写权限对象的delete方法,完成数据库中关于表的删除操做。即外部应用从ContentProvider中删除数据。

   (5)update():返回类型为int,经过对数据库具备可写权限对象的update方法,完成数据库中关于表的更新操做。即外部应用更新ContentProvider中的数据。

   (6)getType():用来标识ContentProvider中数据的类型。

   3:具体实现

public class MyCP extends ContentProvider {
    // 统一资源标识符
    public static final Uri URI = Uri
            .parse("content://com.example.day08_mycontentprovider.MyCP");
    // 声明数据库的建立与更新对象
    private MySqlite mySqlite;
    // 得到数据可读可写的对象
    private SQLiteDatabase dbWriter, dbReader;
    // 得到表名,列名等静态常量
    private static final String CP_TABLE_NAME = MySqlite.TABLE_NAME;
    private static final String CP_TABLE_TITLE = MySqlite.TABLE_TITLE;
    private static final String CP_TABLE_ID = MySqlite.TABLE_ID;
    @Override
    public boolean onCreate() {
        mySqlite = new MySqlite(getContext());// 数据库表的建立
        dbWriter = mySqlite.getWritableDatabase();// 实例化可读可写对象
        dbReader = mySqlite.getReadableDatabase();
        return true;
    }
    // 数据库关于表的查询
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        return dbReader.query(CP_TABLE_NAME, projection, selection,
                selectionArgs, null, null, sortOrder);
    }
    // 数据库关于表的查插入
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        dbWriter.insert(CP_TABLE_NAME, null, values);
        return uri;
    }
    // 数据库关于表的删除
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return dbWriter.delete(CP_TABLE_NAME, selection, selectionArgs);
    }
    // 数据库关于表的更新
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        return dbWriter.update(CP_TABLE_NAME, values, selection, selectionArgs);
    }
    // 返回数据类型
    @Override
    public String getType(Uri uri) {
        return null;
    }
}

   三:内部应用程序的引用

   在应用程序中,经过getContentResolver()方法调用ContentProvider中的几个方法,完成数据中表的操做

public class MainActivity extends Activity {
    // 获得惟一标识ContentProvider的URI
    public Uri uri = MyCP.URI;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        addDB();
        // updateDB();
        // deleteDB();
        selectDB();
    }
    // 添加,经过getContentResolver()得到到ContentProvider的数据解析对象
    public void addDB() {
        ContentValues cv = new ContentValues();
        cv.put("title", "HelloWord");
        getContentResolver().insert(uri, cv);// 调用ContentProvider的insert方法,实现数据的添加
    }
    // 查询
    public void selectDB() {
        // 调用ContentProvider的query方法,实现数据的查询
        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        while (cursor.moveToNext()) {
            System.out
                    .println(cursor.getString(cursor.getColumnIndex("title")));
        }
    }
    // 修改
    public void updateDB() {
        // 调用ContentProvider的update方法,实现数据的修改
        ContentValues cv = new ContentValues();
        cv.put("title", "我更名了,我叫张三");
        getContentResolver().update(uri, cv, null, null);
    }
    // 删除
    public void deleteDB() {
        // 调用ContentProvider的delete方法,实现数据的删除
        getContentResolver().delete(uri, null, null);
    }
}

   四:外部应用程序的引用

   1:提取ContentProvider的惟一标识符URI为静态常量,其值为同上。

   2:经过getContentResolver()方法调用ContentProvider中的几个方法,完成数据中表的操做。

public class MainActivity extends Activity {
    //提取统一资源标识符URI,才能找获得ContentProvider所存储的数据
    public static final Uri URI = Uri.parse("content://com.example.day08_mycontentprovider.MyCP");
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        selectDB();//对方法的调用
    }
//经过getContentResolver()方法调用ContentProvider中的几个方法,完成数据中表的操做。
    public void selectDB(){
        Cursor cursor = getContentResolver().query(URI, null, null, null, null);
        while(cursor.moveToNext()){
            System.out.println(cursor.getString(cursor.getColumnIndex("title")));
        }
    }
}

  五:结果

  内部应用:数据库中的表存在于data/data/包名/database/***.db中,导出,运用SQLite Export查看存在于表中的数据

   外部应用:在控制台输出数据库中表的数据

08-31 10:31:39.158: I/System.out(285): HelloWord

   

  好声音开始了。。。

相关文章
相关标签/搜索