0

SQLite データベースを使用していくつかの文字列を保存しています。初めてアプリケーションを起動するときに、このコードを使用してこれらの文字列を追加しています。

DatabaseHandler db = new DatabaseHandler(this);
db.addProducts(//lot of strings appended to make a single String);
db.close();

DatabaseHandler は次のとおりです。

public class DatabaseHandler extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "my_db";
    private static final String TABLE_NAME = "products";
    private static final String KEY_NAME = "pname";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
                + KEY_NAME + " TEXT" + ")";
        db.execSQL(CREATE_PRODUCTS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public void addProducts(String product_name) {

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, product_name); // Product Name
        db.insert(TABLE_NAME, null, values);
        db.close();
    }

    public String getProducts() {

        SQLiteDatabase db = this.getReadableDatabase();
        String selectQuery = "SELECT  * FROM " + TABLE_NAME;
        Cursor cursor = db.rawQuery(selectQuery, null);
        String s = "default";
        if (cursor.moveToFirst()) {
            int n = cursor.getCount();
            s = cursor.getString(0);
        }
        cursor.close();
        return s;
    }
}

問題は、テーブルproductsが存在するかどうかを確認していない場合db.addProducts("");、アプリケーションが起動されるたびに を呼び出すことです。そして、カーソル数は1毎回増加し、最終的にはneed to extend dbそのようなことを言います。テーブルが既に存在するかどうかを確認するにはどうすればよいですか??

私はこれしか見つけることができません: How to check if database exists:

public static boolean checkDataBase(String DB_FULL_PATH) {
    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 checkDB != null ? true : false;
}

ここで私はパスに行き詰まっています。データベースのパスを取得するにはどうすればよいですか?

さらに、データベースではなくテーブルが存在するかどうかを確認すると便利です。

ありがとうございました

4

4 に答える 4

0

データベースにはテーブルが 1 つしかありません。まず、データベースが作成されているか、これを使用していないかを確認してください

        private boolean checkDataBase() {
       // TODO Auto-generated method stub
          File dbFile = new File(DB_PATH + DB_NAME);
          return dbFile.exists();
   }

データベースを分析するには SQLite Database Browser を使用します

于 2012-09-07T07:17:24.837 に答える
0

これは PATH-Question に役立つと思います。次のチュートリアルにあります: http://www.vogella.com/articles/AndroidSQLite/article.html#sqliteoverview " SQLite データベースへのアクセスには、ファイルシステムへのアクセスが含まれます。これには時間がかかる場合があります。したがって、データベース操作を非同期で実行することをお勧めします。 、たとえば AsyncTask クラス内。

アプリケーションがデータベースを作成する場合、このデータベースはデフォルトでディレクトリ DATA/data/APP_NAME/databases/FILENAME に保存されます。

上記のディレクトリの各部分は、次の規則に基づいて構成されています。DATA は Environment.getDataDirectory() メソッドが返すパスです。APP_NAME はアプリケーション名です。FILENAME は、データベースのアプリケーション コードで指定する名前です。"

したがって、1 つのデータベースに対して、ファイルシステムに 1 つのファイルが存在します。/data/data/package.name/databases です。package.name は、アプリケーションのパッケージ名です。データベースは、データベースの名前です。

于 2012-09-07T07:32:39.817 に答える
0

私の意見では、より洗練された解決策は、共有参照のようなものを持つことです。「ユーザーは初めてアプリを起動しましたか?」という方法で何かを確認できるように、これを実行したいと考えています。

次のようなことができます。

public void firstRunPreferences(){
            Context mContext = this.getApplicationContext();
            mPrefs = mContext.getSharedPreferences("myAppPrefs", 0);
        }

public void setRunned(){
        SharedPreferences.Editor editor = mPrefs.edit();
        editor.putBoolean("firstRun", false);
        editor.commit();
    }

    public boolean getFirstRun(){
        return mPrefs.getBoolean("firstRun", true);
    }

最初のメソッドはアプリの sharedPreferences のインスタンスを取得し、2 番目のメソッドはブール値を操作して追加します。

このメソッドはいつでも呼び出すことができます (たとえば、DB ヘルパー クラスを最初にインスタンス化するときに、setRunned を dbCreated に置き換えます)。

頑張ってコーディングしてください!

于 2012-09-07T07:28:48.820 に答える
0

これをRaw Queryで使用すると、CREATE TABLE IF NOT EXISTS "+TABLENAME+";毎回テーブルが作成されません

于 2012-09-07T07:05:09.883 に答える