2

非常にうまく文書化されている SQLiteOpenHelper クラスのこの優れた例を見つけました。これを自分のアプリケーションに使用できると思います。問題は、アプリによって作成されたデータベースが既に存在するかどうかを判断するのにまだ苦労していることです

私のアプリにはメイン アクティビティ Java クラス [想像上の名前] ' ActivityMain' があり、現時点では void を呼び出していますdbTest();

public void DBTest() {

        SQLiteDatabase myDB = null;

        /* Create a Database. */
        try {
            myDB = this.openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);

            /* Create a Table in the Database. */
            myDB.execSQL("CREATE TABLE IF NOT EXISTS "
                    + DATABASE_TABLE
                    + " (" + KEY_ID + " integer primary key autoincrement, "
                    + KEY_SCRIPT_NAME + " text, " + KEY_SCRIPT_BODY + " text, "
                    + KEY_SU_NEEDED + " short);");

            /* Insert data to a Table*/
            myDB.execSQL("INSERT INTO "
                    + DATABASE_TABLE
                    + " (" + KEY_SCRIPT_NAME
                    + ", " + KEY_SCRIPT_BODY
                    + ", " + KEY_SU_NEEDED + ")"
                    + " VALUES ('CPU information', 'cat /proc/cpuinfo', 1);");

            /*retrieve data from database */
            Cursor c = myDB.rawQuery("SELECT * FROM " + DATABASE_TABLE, null);

            int scriptName = c.getColumnIndex("name");

            // Check if our result was valid.
            c.moveToFirst();
            // cursor left as it came from the database because it starts at the row before the first row
            ArrayList<String> sData = new ArrayList<String>();
            if (c != null) {
                do {
                    String Name = c.getString(scriptName);
                    sData.add(Name);
                } while (c.moveToNext());
            }

            ListView lv = (ListView) findViewById(R.id.mainListView);
            lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, sData));
            lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        } catch (Exception e) {
            Log.e("Error", "Error", e);
        } finally {
            if (myDB != null)
                myDB.close();
        }

そこにデータベースを作成し、行を挿入してから ListView に表示します。現在、これはアプリが起動されるたびに同じ行を挿入するだけなので、データベースが既に存在するかどうかを確認したいと思います。

そこにいくつかの初期値でデータベースを開始させたいので、データを挿入しています。ユーザーは、必要に応じてデータを削除できます

したがって、私の ' ' クラスでは、リンクされたサンプルから使用した ' ' クラスからメソッドActivityMainを呼び出したいのですが、できませんcreateDataBase();DatabaseHelper

それは次のようなものですか:

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_main);

                try {
            createDataBase();
            catch(SQLiteException e){
                // database doesn't exist yet.
                return false;
            }

' ' クラスに正常に動作するブール関数がありますActivityMainが、これが正しい方法であるかどうかはわかりません。実際には、ヘルパー クラスを介してこれらすべてを実行する必要があります。

private boolean checkDatabase() {
    SQLiteDatabase checkDB = null;
    try {
        checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null,
                SQLiteDatabase.OPEN_READONLY);
        checkDB.close();
    } catch (SQLiteException e) {
        // database doesn't exist yet.
        return false;
    }
    return checkDB != null ? true : false;
}

誰かが私にいくつかの指針を教えてもらえますか?

どうもありがとう :)

4

3 に答える 3

1

チュートリアルは素晴らしいですが、公式のAPIドキュメントのようなものはありません。常に公式ドキュメントをお読みください。チュートリアルは、簡単にするために、常にもの(時には重要なもの)を省略します。

ご覧のとおり、DBが存在しない場合getReadableDatabse()getWritableDatabase()自動的に呼び出されます。onCreate()

これが私がそれを行う方法の例です(テストされていませんが、それを行う方法を示す必要があります):

public class YourDBManager extends SQLiteOpenHelper {

    private SQLiteDatabase db = null;

    public YourDBManager(final Context context, final String dbName, final int dbVersion) {
        super(context, dbName, null, dbVersion);
        db = getWritableDatabase();
    }

    /** Initializes your DB */
    private void initializeDB(final SQLiteDatabase db) throws SQLException {
        // Do whatever you want to do to initialize your DB here
    }

    /** 
     * This method is NOT called directly by you but called by SQLiteOpenHelper, 
     * but by getReadableDatabase()/getWritableDatabase() in case it doesn't exist.
     * Here you do whatever you want to do to initialize the DB the first time it is created.
     */
    @Override
    public void onCreate(final SQLiteDatabase db) throws SQLException {
        Log.i(TAG, "=====DATABASE DOES NOT EXIST: CREATING IT======");
        initializeDB(db);
    }
}

public class YourActivity extends Activity {

    private YourDBManager dbMan = null;

    /** Do NOT call from UIThread! */
    private void initializeDBManager() {
        dbMan = new YourDBManager(this, "mydatabase", 1);
    }
}

お役に立てれば。

于 2013-01-09T16:58:01.013 に答える
1

あなたはすでに正しいやり方で物事を進めていると思います。このトピックに関する他のいくつかの質問 ( Android データベースが存在する場合はクエリを実行します!Android - Does SQLite Database Exist?など) では、データベースを開き、DB が存在しないことを示すために例外をキャッチすることをお勧めします。

于 2013-01-09T21:01:11.600 に答える
1

を使用して、データベースファイルが存在するかどうかを確認できます

File dbFile = context.getDatabasePath(DATABASE_NAME);
if(dbFile.exists()){
// do something
}

ただし、データベースが有効かどうかはわかりません。

于 2013-01-09T19:07:03.097 に答える