Android学習6週目_SQLiteとContentProvider


一、SQLite
1、基本概念SQLiteは軽量級、独立、隔離、プラットフォーム間、多言語インタフェース、安全性の高い関係型データベースであり、主に組み込み機器に用いられ、AndroidのデータベースはSQLiteデータベースを使用する.2、データベースの作成1)クラスの作成
public class DataBaseHelper extends SQLiteOpenHelper

2)DataBaseHelperの作成方法
public DataBaseHelper(Context context){
        super(context,DATABASE_NAME,null,1);
    }

3)SQLiteOpenHelperのonCreateとonUpgradeの書き換え方法
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table " + USER_TABLE_NAME +" "+ "(" + USERNAME + " varchar(20) not null," + PASSWORD + " varchar(32) not null," + STATE + " boolean not null)";
        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            String sql = "drop table if exists" + USERNAME;
            db.execSQL(sql);
            this.onCreate(db);
        }
    }

3、操作データベース1)作成したデータベースをMainActivityで呼び出す
DatabaseHelper databaseHelper = new DatabaseHelper(this);
mSqLiteDatabase = databaseHelper.getWritableDatabase();

2)作成したデータベースにデータを追加する
private void addData() {
        // IO  ,      
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.USERNAME, "xxxx");
        contentValues.put(DatabaseHelper.AGE, "119");

        long rowNumber = mSqLiteDatabase.insert(DatabaseHelper.USER_TABLE_NAME, null ,              contentValues);
        if(rowNumber != -1){
            Toast.makeText(DatabaseButtonActivity.this, "    ", Toast.LENGTH_SHORT).show();
        }
    }

3)データの削除
// delete:
String whereClauseString = "username=?";
String[] whereArgsString = {"xxxx"};
mSqLiteDatabase.delete(DatabaseHelper.USER_TABLE_NAME, whereClauseString, whereArgsString);

4)データの更新
//update
ContentValues mContentValues = new ContentValues();
mContentValues.put("age","10");
whereClauseString = "username=?";
sqLiteDatabase.update("user",contentValues,whereClauseString,whereArgsString);

5)データの最適化
  • 元のSQL文の実行効率がより高いrawQuery execSQL;
  • は有用な列、有用な行のみを検索し、少ないほど良い.
  • データが多い場合は、ソートが必要です.
  • は、データが多い場合にインデックスを作成する必要があるため、検索が容易であるため、インデックスを作成します.
  • 一度に多くのデータを処理する場合は、物事処理
  • を使用する必要がある.
    事物処理のコードは以下の通りである.
     //        db    
     mSqLiteDatabase.beginTransaction();
     try {
        //      
        for (int i = 0; i < 1000; i++) {
            mSqLiteDatabase.execSQL("insert into user(username, age) values ('liu da ming','5 ')");
        }
       mSqLiteDatabase.setTransactionSuccessful();
       //     
    } catch (Exception e) {
       e.printStackTrace();
    } finally {
       mSqLiteDatabase.endTransaction();
    }

    6)ORMオブジェクトリレーションシップマッピングは、複雑なsql文を操作するのではなく、オブジェクトのプロパティとメソッドを直接操作することで、簡単なデータベースにとって良い選択です.
    二、ContentProvider
    1、基本的な概念
  • アプリケーション間でデータを共有する方法
  • は、データの格納および取得のための統合インタフェース
  • を提供する.
  • Androidは、一般的なデータの一部にデフォルトのContentProvider
  • を提供しています.
  • Uri、汎用リソース識別子
  • 2、ContentProviderのインタフェース
     public class TestContentProvider extends ContentProvider {
        @Override
        public boolean onCreate() {
        return false;
        }
    
        @Nullable
        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
           }
    
        @Nullable
        @Override
        public String getType(Uri uri) {
        return null;
          }
    
        @Nullable
        @Override
        public Uri insert(Uri uri, ContentValues values) {
        return null;
          }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
          }
    
         @Override
          public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
          return 0;
         }
        }

    3、実例
    public class TestContentProvider extends ContentProvider {
    private  static  UriMatcher sUriMatcher;
    public  static  final int URI_MATCH_USER = 1;
    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    
        sUriMatcher.addURI(URIList.AUTHORITY,DatabaseHelper.USER_TABLE_NAME,URI_MATCH_USER);
    }
    
    private DatabaseHelper mDatabaseHelper;
    @Override
    public boolean onCreate() {
        mDatabaseHelper = new DatabaseHelper(getContext());
        return false;
    }
    
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        String tablename = getTableName(uri);
        if(TextUtils.isEmpty(tablename)){
            return  null;
        }
        Cursor cursor = mDatabaseHelper.getReadableDatabase().query(tablename,projection,selection,selectionArgs,null,null,sortOrder);
    
        return cursor;
    }
    
    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }
    
    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        String tablename = getTableName(uri);
        if(TextUtils.isEmpty(tablename)){
            return  null;
        }
         long id =   mDatabaseHelper.getWritableDatabase().insert(tablename,null,values);
    
    
        return ContentUris.withAppendedId(uri,id);
    }
    
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        String tablename = getTableName(uri);
        if(TextUtils.isEmpty(tablename)){
            return  -1;
        }
    
        int count =   mDatabaseHelper.getWritableDatabase().delete(tablename,selection,selectionArgs);
        return count;
    }
    
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    
        String tablename = getTableName(uri);
        if(TextUtils.isEmpty(tablename)){
            return  -1;
        }
        int count =  mDatabaseHelper.getWritableDatabase().update(tablename,values,selection,selectionArgs);
        return count;
    }
    
    private String getTableName(Uri uri){
        int type = sUriMatcher.match(uri);
        String tablename = null;
    
        switch (type){
    
            case URI_MATCH_USER:
                 tablename = DatabaseHelper.USER_TABLE_NAME;
                break;
        }
        return tablename;
        }
    }

    三、まとめ
    この章はよくわかりませんが、練習が必要です.