AndroidデータストアのsharedpreferencesとContent Provider


Androidには、次のようなデータ操作が含まれています.
file,sqlite 3,Preferences,ContectResolverとContentProviderの前の3つのデータ操作方式はいずれも本アプリケーション内のデータに対してのみであり,プログラムはこの3つの方法で他のアプリケーション内のデータを操作することはできない.
ここでsqlite 3は前節で述べたように、この節には主にsharedpreferencesとContentProviderが含まれています.
sharedpreferences保存データ
//   SharedPreferences  (   ) 

SharedPreferences mySharedPreferences= getSharedPreferences("test", 
Activity.MODE_PRIVATE); 
//   SharedPreferences.Editor  (   ) 
SharedPreferences.Editor editor = mySharedPreferences.edit(); 
// putString        
editor.putString("name", "Karl"); 
editor.putString("habit", "sleep"); 
//       
editor.commit(); 
//  toast              
Toast.makeText(this, "      SharedPreferences!" , Toast.LENGTH_LONG).show();

以上のコードを実行すると、SharedPreferencesはこれらのデータをtestに保存します.xmlファイルでは、File Explorerのdata/data/対応するパッケージ名/test.xmlでファイルをエクスポートし、表示します.
2、SharedPreferencesを用いてデータを読み取る方法は以下の通りである.
//  ,   SharedPreferences          SharedPreferences   
SharedPreferencessharedPreferences= getSharedPreferences("test", 
Activity.MODE_PRIVATE); 
//   getString    value,   2    value     
String name =sharedPreferences.getString("name", ""); 
String habit =sharedPreferences.getString("habit", ""); 
//  toast          
Toast.makeText(this, "      :"+"
"
+"name:" + name + "
"
+ "habit:" + habit, Toast.LENGTH_LONG).show();

コンテンツプロバイダ
manifestファイルに登録すると、アンドロイドの4つのコンポーネントが登録されます.
provider android:name="com.zj.sqlitedemo.providers.PersonContentProvider"
            android:authorities="com.zj.sqlitedemo.providers.PersonContentProvider"
            ></provider>

他の呼び出し元にアクセスするためのアクセスパスの設定
    private final static String authority ="com.zj.sqlitedemo.providers.PersonContentProvider";
    private final static int PERSON_INSERT_CODE=0;
    private final static int PERSON_DELETE_CODE=1;
    private final static int PERSON_UPDATE_CODE=2;
    private final static int PERSON_QUERY_ALL_CODE=3;
    private final static UriMatcher uriMatcher;
    private PersonSQLiteOpenHelper mOpenHelper;
    static
    {
        uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);

        //    URI
        uriMatcher.addURI(authority, "person/insert", PERSON_INSERT_CODE);
        uriMatcher.addURI(authority, "person/delete", PERSON_DELETE_CODE);
        uriMatcher.addURI(authority, "person/update", PERSON_UPDATE_CODE);
        uriMatcher.addURI(authority, "person/queryAll", PERSON_QUERY_ALL_CODE);
    }

主な方法:
 
public boolean onCreate()ContentProviderの作成時に呼び出す
public Cursor query(Uri,String[],String,String[],String)は、指定したUriのContentProviderをクエリーし、Cursorを返します.
public Uri insert(Uri,ContentValue)は、指定したUriのContentProviderにデータを追加するために使用されます.
public int update(Uri,ContentValue,String,String[])は、指定したUriのContentProviderのデータを更新するために使用されます.
public int delete(Uri,String,String[])は、指定したUriのContentProviderからデータを削除するために使用されます.
public String getType(Uri)指定したUriのデータを返すMIMEタイプ
*操作データが集合型である場合、MIME型文字列はvndであるべきである.android.cursor.dir/先頭.
たとえば、すべてのpersonレコードを取得するUriはcontent://contacts/personでは、返されるMIMEタイプ文字列は「vnd.android.cursor.dir/person”.
*操作するデータが集合型以外のデータである場合、MIME型文字列はvndであるべきである.android.cursor.item/冒頭.
例えば、idが10のpersonレコードを取得するUriはcontent://contacts/person/10では、返されるMIMEタイプ文字列は「vnd.android.cursor.item/person”.
メソッド実装
クエリー方法
public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        switch(uriMatcher.match(uri))
        {
        case PERSON_QUERY_ALL_CODE:
            //     
            SQLiteDatabase db= mOpenHelper.getWritableDatabase();
            if(db.isOpen())
            {
                Cursor cursor= db.query("person", projection, selection, selectionArgs,null,null,sortOrder);
                return cursor;
            }
            break;
            default:

                throw new IllegalArgumentException("URI   "+uri);

        }
        return null;
    }

挿入方法
public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub

        switch(uriMatcher.match(uri))
        {
        case PERSON_INSERT_CODE:
            //     
            SQLiteDatabase db= mOpenHelper.getWritableDatabase();
            if(db.isOpen())
            {
                long id=db.insert("person", null, values);

                db.close();
                return ContentUris.withAppendedId(uri, id);
            }
            break;
            default:

                throw new IllegalArgumentException("URI   ");

        }
        return null;
    }

メソッド実装の削除
public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        switch(uriMatcher.match(uri))
        {
        case PERSON_DELETE_CODE:
            //     
            SQLiteDatabase db= mOpenHelper.getWritableDatabase();
            if(db.isOpen())
            {
                int count=db.delete("person", selection, selectionArgs);

                db.close();
                return  count;
            }
            break;
            default:

                throw new IllegalArgumentException("URI   "+uri);

        }
        return 0;
    }

更新メソッドの実装
public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub

        switch(uriMatcher.match(uri))
        {
        case PERSON_UPDATE_CODE:
            //     
            SQLiteDatabase db= mOpenHelper.getWritableDatabase();
            if(db.isOpen())
            {
                int count=db.update("person", values, selection, selectionArgs);

                db.close();
                return  count;
            }
            break;
            default:

                throw new IllegalArgumentException("URI   "+uri);

        }
        return 0;
    }

取得タイプ
public String getType(Uri uri) {
        // TODO Auto-generated method stub
        switch(uriMatcher.match(uri))
        {
        case PERSON_QUERY_ALL_CODE:
            return "vnd.android.cursor.dir/person";

           default:
               break;
        }
        return null;
    }

注意:*操作データが集合タイプに属する場合、MIMEタイプ文字列はvndであるべきである.android.cursor.dir/先頭.
たとえば、すべてのpersonレコードを取得するUriはcontent://contacts/personでは、返されるMIMEタイプ文字列は「vnd.android.cursor.dir/person”.
*操作するデータが集合型以外のデータである場合、MIME型文字列はvndであるべきである.android.cursor.item/冒頭.
例えば、idが10のpersonレコードを取得するUriはcontent://contacts/person/10では、返されるMIMEタイプ文字列は「vnd.android.cursor.item/person”.
例えばここではvndを用いる.android.cursor.dir先頭
ContentResolverは、コンテンツプロバイダが提供するデータを解析します.外部アプリケーションがContentProviderのデータの追加、削除、変更、クエリー操作を行う必要がある場合は、ContentResolverクラスを使用して完了できます.ContentResolverオブジェクトを取得するには、Contextが提供するgetContentResolver()メソッドを使用します.
インプリメンテーションの挿入
public void testInsert()
    {
        Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/insert");
        ContentResolver resolver= getContext().getContentResolver();
        ContentValues values=new ContentValues();
        values.put("name", "  ");
        values.put("age", 25);
        uri=resolver.insert(uri,values);
        Log.i(tag, "uri"+uri);
        long id=ContentUris.parseId(uri);
        Log.i(tag, "   "+id);
    }

インプリメンテーションの削除
public void testDelete()
    {
        Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/delete");

        ContentResolver resolver= getContext().getContentResolver();

        String where="_id=?";
        String []selectionArgs={"21"};
        int count=resolver.delete(uri, where, selectionArgs);
        Log.i(tag, "    :"+count);
    }

実装の更新
public void testUpdate()
    {
        Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/delete");

        ContentResolver resolver= getContext().getContentResolver();

        ContentValues values=new ContentValues();
        values.put("name", "zj");

        int count=resolver.update(uri, values, "_id=?", new String[]{"20"});
        Log.i(tag, "   "+count);

    }

クエリの実装
public void testQueryAll()
    {
        Uri uri=Uri.parse("content://com.zj.sqlitedemo.providers.PersonContentProvider/person/queryAll");
        ContentResolver resolver= getContext().getContentResolver();

        Cursor cursor=resolver.query(uri, new String[]{"_id","name","age"}, null, null, null);
        if(cursor!=null&&cursor.getCount()>0)
        {
            int id;
            String name;
            int age;
            while(cursor.moveToNext())
            {
                 id=cursor.getInt(0);
                 name=cursor.getString(1);
                 age=cursor.getInt(2);
                 Log.i(tag, "id:"+id+"name:"+name+"age:"+age);
            }
            cursor.close();
        }
    }

コンテンツプロバイダとsharedpreferencesの完了