1

私がやろうとしているのは、Android で複数のテーブルを持つ sqlite db を作成することです (これを行う方法を知っています)。私がやりたいことは、各テーブルを作成し、データベースを開いたり閉じたりする 1 つのクラス (Activity) を持つことです。次に、テーブルごとに、insert、delete、select ステートメントに使用するクラスを作成します。例が見つからないように見えるので、これを行う方法が混乱しています。

私が現在持っているのは、テーブルを作成し、開き、挿入し、削除する各テーブルのクラスですが、アプリが1つのテーブルを作成すると、アプリは他のテーブルを作成しません。私がやりたいことがA.可能であり、B.良い習慣であるかどうか、誰かにアドバイスしてもらえますか。

それとも、すべての SQL を 1 つのクラスに入れる必要がありますか?

4

3 に答える 3

4

あなたの質問を正確に理解することはできませんが、ContentProviderを探すことをお勧めします。データベースの作成とリクエストを分離する最良の方法です。

次に、データベースの作成に問題があるようです。から拡張されたクラスを使用していると思いますSQLiteOpenHelper。テーブルを別のクラスに分けることはできますがonCreateSQLiteOpenHelper拡張クラスの呼び出しを 1 回だけ行う必要があります。ただし、このメソッドで、テーブルごとに異なるクラスの他の静的メソッドを呼び出すことができます。データベースのメンテナンスを容易にする適切な方法です。あなたの問題を理解できれば、いくつかのサンプルを提供できます。

于 2012-08-16T21:37:56.223 に答える
3

私はちょうど同じ問題を抱えて修正しました。すべてのテーブルは同時に作成する必要がありますが、個別の SQL ステートメントを使用する必要があります。私がしたことは、個別の SQLOpenHelper クラスを保持し、ヘルパー クラスの静的文字列であるすべての CREATE ステートメントを実行する 1 つのメソッドで新しい「Creator」クラスを作成することでした。次に、各ヘルパー クラスが onCreate() でそのメソッドを呼び出しました。

于 2012-09-10T10:13:07.047 に答える
0

良い実践につながる可能性のあるアプローチがいくつかあります。Vogella のブログは常に参考になりました。このアプローチをご覧ください。これは、データベースの作成と更新を制御するクラスと、特定のタイプのオブジェクトに必要な要求を行う DAO としての別のクラスで構成されています。

個人的には、Singleton クラス内で両方を組み合わせて使用​​してきました。これは、インスタンス (私の場合は SQLiteDatabase) のライフサイクル全体を維持および制御するのに最適で、開かずに実行する必要があるタスクを作成できます。データベースオブジェクトへの参照を閉じたり失ったりします。同じクラスが SQLiteOpenHelper から継承され、データベースの作成と更新を管理します。

一般的な構造は次のようになります。

package your.package;

import java.io.File;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBManager extends SQLiteOpenHelper {

private static DBManager sInstance;

private static SQLiteDatabase db;

private final String LOG_TAG = this.getClass().getSimpleName();

private static final String DB_NAME = "DBName";
private static final int DB_VERSION = 1;

public static synchronized DBManager getInstance(Context _c) {
if (sInstance == null) {
    sInstance = new DBManager(_c);
}
return sInstance;
}

private DBManager(Context _c) {
super(_c, DB_NAME, null, DB_VERSION);
}

public void deleteTable(String table) {
if (db == null || !db.isOpen()) {
    db = getWritableDatabase();
}

db.execSQL("DROP TABLE " + table);
db.close();
}

public void reset() {

File dbFile = new File(getReadableDatabase().getPath());
dbFile.delete();

sInstance = null;
db.close();
}

public static void closeDB() {
if (sInstance != null && db != null && db.isOpen()) {
    db.close();
}
}

public long insertContent(String table, ContentValues cv) {
if (db == null || !db.isOpen()) {
    db = getWritableDatabase();
}

return db.insert(table, null, cv);
}

public void updateContent(String table, ContentValues cv, String whereClause, String[] whereArgs) {
if (db == null || !db.isOpen()) {
    db = getWritableDatabase();
}

db.update(table, cv, whereClause, whereArgs);
}

@Override
public void onCreate(SQLiteDatabase db) {

if (db == null || !db.isOpen()) {
    db = getWritableDatabase();
}

db.execSQL("your query");
}

@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.i(LOG_TAG, "onUpgrade old: " + oldVersion + " new: " + newVersion);
}

}
于 2012-08-16T21:51:24.960 に答える