2010-11-27 27 views
1

データベースの接続と作業を支援するために、SQLiteOpenHelperクラスを拡張しています。 documentationによれば、データベースが作成されていない場合にのみ、OnCreateメソッドを呼び出す必要があります。しかし、私の問題は、レコードを挿入するためにクエリを実行しようとすると、このエラーが発生するということです。AndroidのSQLite onCreate()の問題

ERROR/Database(214): Failure 1 (table Sample already exists) on 0x218688 when preparing 
'CREATE TABLE Sample (RecId INT, SampleDesc TEXT);'. 

このCreateクエリがコードで使用される唯一の場所は、このように見えるOnCreateメソッドです。

@Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(SAMPLE_TABLE_CREATE); 
     } 

注:私は次のよtutorial - 私は別のやった唯一の事は、私は公共のSQLiteDatabaseをさせる、各エンティティのために、このクラスを拡張することができるように、代わりに民間のSQLiteDatabaseオブジェクトを公開です継承されたDataHelperクラスのオブジェクトはすべての作業を行います

ここでは、失敗した呼び出しを行うメソッドがあります。

//This method is in the class that extends DataHelper (See note on tutorial) 
    public void createSample(Sample sample)//next action form 
    {   
      String id = sample.getId(); 
      String name = sample.getSummary(); 

      String query = "INSERT INTO " + SAMPLE_TABLE_NAME + "(" + SAMPLE_Id + "," + 
         SAMPLE_NAME + ") " + " VALUES (" + id + "," + name + ")"; 

      try{   
       data.rawQuery(query, null);  
      } 
      catch(SQLException e){ 
       Log.i("Sample", "Errors: Sample LN60: " + e.getMessage()); 
      } 
    } 

誰かが私が間違ってやっているものを私に伝えることができますか?それともハック(表文を作成し実行する前に存在している場合つまりチェック)

作成しているので、最初のエラーは非常に単純である

+0

は(私は、手動でDBがすでに作成されているかどうかを確認する必要はありませんコードのソースDBがまだ作成されていない場合に呼び出されます)。おそらくDB関連のコードをすべて投稿しますか? –

答えて

1

これはあなたの活動を一度実行した後で、それ以降はDBを破壊しないためですか? 2回目にこのエラーが発生します。

データベースは/data/data/YOUR_PACKAGE/databases/に格納されていますので、作成する前にDBが存在するかどうかを確認することをお勧めします。

//The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; 
    private static String DB_NAME = "myDBName"; 

    SQLiteDatabase checkDB = null; 

    String myPath = DB_PATH + DB_NAME; 
    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    if(checkDB){ 
     //do nothing 
    }else{ 
     //create DB 
    } 

のonCreate()が唯一であるので、私のアプリでは、それは箱から出して[OK]を右に動作しますhereそれは奇妙だ

0

...私はこの問題を解決するために投稿することができ、他のどのようなコード教えてください既に存在するテーブルなので、作成する前にテーブルが存在する場合はチェックを追加すると良いでしょう。 SQLite dBが作成または作成されると、画面の再作成または描画に似たデフォルトのonCreate()呼び出しとは異なり、誰かまたは何かがそれを削除するまで、SQLite dBは保持されます。

+0

私の懸案事項は、データベースが存在しない場合にのみcreateステートメントを呼び出す必要があるということです。 – tpow

+0

はい、データベースの構造を作って基本的なフィールドを設定するときにのみ実行する必要があります。その後、データベースが失われたり破損した場合にのみ、再呼び出しする必要があります。 –

+0

したがって、ここでの質問はstackoverflowにあります。テーブルが失われたり破損したりした場合は、テーブルを再作成するだけで済みます。 k。 – tpow

-2

getWritableDatabase()を呼び出すたびにonCreate()メソッドが呼び出されます。

+0

"CREATE"ステートメントはどこで一度だけ実行されるのですか? – tpow

+1

ステートメントが正しく配置されると、デザインが問題になります。私は専門家ではありませんが、SQLiteOpenHelperを複数継承していないと思います。ロジックを他のクラスに置き、SQLiteOpenHelperの子クラスを使用して低レベルの作業を行います。 –

+0

私はそれが間違っているのだろうか? http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html –