2012-09-07 2 views
0

SQLite 데이터베이스를 사용하여 몇 개의 문자열을 저장하고 있습니다. 첫 번째 응용 프로그램을 시작할 때이 코드를 사용하여이 문자열을 추가합니다.안드로이드 : DataBase 테이블이 이미 존재하는지 어떻게 알 수 있습니까?

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이 있는지 여부를 확인하고 있지 않다 경우, 내가 응용 프로그램을 lauched 때마다 시간 db.addProducts("");를 호출합니다. 그리고 커서 카운트가 매번 1 증가하고 결국 need to extend db 그런 말합니다. 테이블이 이미 있는지 확인하려면 어떻게해야합니까 ??

I는이를 찾을 수 있습니다 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; 
} 

나는 경로로 붙어있다. 어떻게하면 데이터베이스의 경로를 얻을 수 있습니까?

또한 데이터베이스가 아닌 테이블이 있는지 여부를 확인하면 유용 할 것입니다.

이 늘 테이블마다

답변

0

이 질문은 PATH-Question에 도움이 될 것이라고 생각합니다. 에서 튜토리얼에서 찾았습니다. http://www.vogella.com/articles/AndroidSQLite/article.html#sqliteoverview이 "는 SQLite는 데이터베이스에 대한 액세스가 파일 시스템을 액세스하는 것을 포함이 느려질 수 있습니다 따라서는 AsyncTask를 클래스 내부, 예를 들어, 비동기 데이터베이스 작업을 수행하는 것이 좋습니다

응용 프로그램이를 만드는 경우.. 데이터베이스는 기본적으로 DATA/data/APP_NAME/databases/FILENAME 디렉토리에 저장됩니다.

위의 디렉토리 부분은 Environment.getDataDirectory()가 사용하는 경로이며, APP_NAME은 응용 프로그램 이름이고, FILENAME은 데이터베이스의 응용 프로그램 코드에 지정하는 이름입니다."

따라서 하나의 db는 하나의 파일 시스템에 존재합니다. /data/data/package.name/databases package.name은 응용 프로그램의 패키지 이름이고 databases는 db의 이름입니다.

+0

APP_NAME은 String.xml 리소스에있는 appName입니다. 데이터베이스 란 무엇입니까? –

+0

과 Environment.getDataDirectory()는 파일을 toString()을 호출하고 PATH에 사용해야합니까? –

+0

Environment.getDataDirectory()는 데이터 디렉토리를 반환합니다. databases는 db를 찾을 수있는 디렉토리입니다. App_Name은 응용 프로그램의 패키지 이름입니다. – goojr

0

사용이 감사 먼저 확인 데이터베이스를 만들거나이

를 사용하지 않는
 private boolean checkDataBase() { 
     // TODO Auto-generated method stub 
      File dbFile = new File(DB_PATH + DB_NAME); 
      return dbFile.exists(); 
    } 

데이터베이스를 분석하려면 SQlite 데이터베이스 Brouser

+0

하지만 새로운 테이블이 만들어지지 않았기 때문에 커서의 수가 증가하고 있지만 새로운 행이 추가 되었기 때문에 앱을 실행할 때마다 동일한 문자열이 추가됩니다. –

+0

당신이 할 수있는 일은' ON DUPLICATE KEY UPDATE' 키를 누르면 테이블에 중복 값이있을 때마다 업데이트됩니다. 일치하지 않으면 데이터가 업데이트되고 삽입되지 않으면 삽입됩니다. – Anuj

+0

링크를 제공하여 깊이있게 이동할 수있게하십시오. 같은. [링크] http://stackoverflow.com/questions/5930812/insert-into-my sql-database-if-records-already-exists-then-update – Anuj

0

당신은 당신의 데이터베이스에 하나 개의 테이블이를 만드는 당신에게 원시 쿼리 CREATE TABLE IF NOT EXISTS "+TABLENAME+";에서

+0

DB_PATH를 얻는 방법 ??? –

0

더 나은 solut 이온, 내 의견으로는, 공유 참조 같은 것을 가질 것입니다. 나는 당신이 "사용자가 앱을 처음 시작 했습니까?"라는 방식으로 무언가를 확인할 수 있도록 이것을하고 싶다고 생각합니다.

당신은 같은 것을 할 수 있습니다 : 두 번째를 조작하고 부울을 추가하면서

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로 바꾸기).

최고의 행운을 빕니다!

관련 문제