私の Android アプリケーションには、ローカル データベースが必要です。これにはどの方法が最適ですか?どのクラス サブクラスを使用しているか、サブクラス、再実装など。ネットであまりにも多くの情報を見つけましたが、どれがベスト プラクティスであるかはまだわかりません。
5 に答える
それはかなり広い質問であり、経験と使用に関するあなたのレベルに少し依存します.
ただし、一般的な方法はContentProvider
、データベースへのアクセスを抽象化する独自のものを作成することです。この方法を使用Uri
して、選択/更新/削除/挿入クエリを実行できます。
SQLite データベース自体については、SQLite データベースSQLiteOpenHelper
の作成とアップグレードを抽象化するために使用します。これにより、ユーザーがすべてのデータを簡単に失うことなく、データベースをアップグレードできます。
以前のプロジェクトの 1 つで使用したコードの一部を添付して、開始することができます。ただし、すべてを実装することは、単一の質問/回答の範囲外になる場合があります。
public class MyServiceProvider extends ContentProvider {
private SQLiteDatabase db;
@Override
public boolean onCreate() {
// Initialize the database and assign it to the private variable
MyDatabaseHelper sqlHelper = new MyDatabaseHelper(getContext());
db = sqlHelper.getReadableDatabase();
return (db == null)?false:true;
}
@override
Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// handle the query here, form it, do your checks and then access the DB
db.query(....);
}
}
class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String LOG_TAG = "MyAppTag";
private static final String DB_NAME = "Databasename";
private static final String TABLE_NAME = "Tablename";
private static final int DATABASE_VERSION = 2;
public static MyServiceProvider.CONTENT_URI = Uri.parse("content://com.mycompany.myApp.MyAppService/myTableOrIdentifier");
public MyDatabaseHelper(Context context){
super(context, DB_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE IF NOT EXISTS ....";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Here you can perform updates when the database structure changes
// Begin transaction
db.beginTransaction();
try {
if(oldVersion<2){
// Upgrade database structure from Version 1 to 2
String alterTable = "ALTER ....";
db.execSQL(alterTable);
Log.i(LOG_TAG,"Successfully upgraded to Version 2");
}
// This allows you to upgrade from any version to the next most
// recent one in multiple steps as you don't know if the user has
// skipped any of the previous updates
if(oldVersion<3){
// Upgrade database structure from Version 2 to 3
String alterTable = "ALTER ....";
db.execSQL(alterTable);
Log.i(LOG_TAG,"Successfully upgraded to Version 3");
}
// Only when this code is executed, the changes will be applied
// to the database
db.setTransactionSuccessful();
} catch(Exception ex){
ex.printStackTrace();
} finally {
// Ends transaction
// If there was an error, the database won't be altered
db.endTransaction();
}
}
}
その後、カーソルを使用してデータベースと対話できます。
ContentResolver contentResolver = getContentResolver();
...
Cursor c = contentResolver.query(
// The Uri results in content://com.mycompany.myApp.MyAppService/myTableOrIdentifier/someId
Uri.withAppendedPath(MyServiceProvider.CONTENT_URI, someId),
new String[] {
// only get fields we need!
"MyDbFieldIneed"
},
null, null, null);
Cursor
これは、反復して結果を取得できるa を返します。これは、Android のほとんどの実装方法でもあります (つまり、アドレス帳からのアドレスの取得は、Uri と Cursor を介しても機能します)。
編集: コードのハイライトでリンクが見にくいことに気付きました。ここに、必要な重要なクラスのリンクがあります。
- コンテンツプロバイダー | Android デベロッパー
- SQLiteOpenHelper | Android デベロッパー
- カーソル | Android デベロッパー
- UriMatcher | Android デベロッパー
編集2:
また、複数のテーブルで作業する場合UriMatcher
、重要な情報源でもあります
SQLite データベースを使用する最善の方法は、ContentProvider を使用することだと思います。検索すると、ContentProvider API が非常に複雑であることがわかります。しかし、プロセスを実際に非常に簡単にする非常に優れたライブラリがあります。それは ProviGen と呼ばれ、以下のリンクで詳細情報を見つけることができます。
https://github.com/TimotheeJeannin/ProviGen
使い方はとても簡単です。アノテーションを使用してデータベースに必要な列を示す Contract クラスを作成するだけで、すべてが自動的に作成されます。1 つのデータベースに複数のテーブルを作成することもできます。
Which is the best manner for this?
SQLite
Androidに付属しているもの
を使用する必要があります。すべての Android アプリは独自のデータベースを持つことができます。
which class sub I use, subclass, reimplement,
SQLiteOpenHelper
データベースの名前、アップグレード/ダウングレードの方法、テーブルの構造などを決定するクラス
を拡張する必要があります。また、データベースへの参照を取得するメソッドも定義します。
はい、多くのリソースがありますが、頭脳にやさしく質の高いリソースではありません. 私が気に入っているものをいくつか紹介します:
Lars Vogel による SQLite と CONtentProvider
ガスティン教授の Android チュートリアル
質問のタイトルについては、Best practices for Android databases
正規化など、SQL データベースに適用されるすべてのベスト プラクティスがここに適用されるとしか言えません。