Android:如何知道DataBase表是否已经存在?

时间:2012-09-07 07:01:28

标签: android database sqlite

我使用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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您的数据库中只有一个表,  首先使用此

检查您的数据库是否已创建
        private boolean checkDataBase() {
       // TODO Auto-generated method stub
          File dbFile = new File(DB_PATH + DB_NAME);
          return dbFile.exists();
   }

分析数据库使用SQlite数据库Brouser

答案 2 :(得分: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类时,使用dbCreated替换setRunned。)

祝你好运!

答案 3 :(得分: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在die文件系统中存在一个文件。那是/data/data/package.name/databases。 package.name是应用程序的包名。数据库是数据库的名称。