0

我正在使用 SQLite 数据库来存储一些字符串。当我第一次启动应用程序时,我正在使用此代码添加这些字符串。

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

数据库处理程序是:

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

在原始查询中使用它,CREATE TABLE IF NOT EXISTS "+TABLENAME+";这不会每次都创建一个表

于 2012-09-07T07:05:09.883 回答
0

您的数据库中只有一个表,首先检查您的数据库是否已创建

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

分析数据库使用 SQlite Database Brouser

于 2012-09-07T07:17:24.837 回答
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 实例,而第二种方法操作并添加一个布尔值。

您可以在任何时候调用该方法(例如,当您第一次实例化 DB Helper 类时,将 setRunned 替换为 dbCreated)。

祝你编码好运!

于 2012-09-07T07:28:48.820 回答
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 是您在应用程序代码中为数据库指定的名称。"

因此,对于一个 db,文件系统中存在一个文件。那就是/data/data/package.name/databases。package.name 是应用程序的包名。databases 是您的数据库的名称。

于 2012-09-07T07:32:39.817 回答