2011-12-09 17 views
0

私のデータベース内に2番目のテーブルを作成したいという問題があります。ここで私は第二のテーブルのために、このデータベースへのカーソルの呼び出しを持っているコードSQLiteは2番目のテーブルを作成しません

public class CBDataBaseHelper { 

public static final String KEY_ROWID = "_id"; 
public static final String KEY_NAME = "Recipe_Name"; 
public static final String KEY_CATEGORY = "Recipe_Category"; 
public static final String KEY_DESCRIPTION = "Recipe_Description"; 

public static final String KEY_ROWID2 = "_id"; 
public static final String fKEY_ROWID2 = "f_id"; 
public static final String KEY_NAME2 = "Ingredient_Name"; 

private static final String DATABASE_NAME = "Recipedb"; 
private static final String DATABASE_TABLE = "RecipeData"; 
private static final String DATABASE_TABLE2 = "IngredientData"; 
private static final int DATABASE_VERSION = 1; 

private DBHelper myHelper; 
private final Context mycontext; 
private SQLiteDatabase mydatabase; 

private static class DBHelper extends SQLiteOpenHelper { 
    public DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     db.execSQL("CREATE TABLE " + DATABASE_TABLE + "(" + KEY_ROWID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME 
       + " TEXT NOT NULL, " + KEY_CATEGORY + " TEXT NOT NULL," 
       + KEY_DESCRIPTION + " TEXT NOT NULL" + ") "); 

     db.execSQL("CREATE TABLE " + DATABASE_TABLE2 + "(" 
     + KEY_ROWID2 + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + KEY_NAME2 + " TEXT NOT NULL, " 
     + fKEY_ROWID2 + " INTEGER , FOREIGN KEY " + "(" + fKEY_ROWID2 + ") " + "REFERENCES " + DATABASE_TABLE + " (" + KEY_ROWID + "))"); 

    } 





    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

     db.execSQL("DROP IF EXISTS " + DATABASE_TABLE); 
     db.execSQL("DROP IF EXISTS " + DATABASE_TABLE2); 
     onCreate(db); 

    } 
} 

public CBDataBaseHelper(Context c){ 
    mycontext = c; 

} 

public CBDataBaseHelper open() throws SQLException{ 
    myHelper = new DBHelper(mycontext); 
    mydatabase = myHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    myHelper.close(); 
} 


public long createEntry(String name, String description, String category){ 

    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME, name); 
    cv.put(KEY_CATEGORY, description); 
    cv.put(KEY_DESCRIPTION, category); 
    return mydatabase.insert(DATABASE_TABLE, null, cv); 

} 

public long createEntry2(String name){ 

    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME2, name); 
    return mydatabase.insert(DATABASE_TABLE2, null, cv); 

} 

public Cursor query() { 
    // Open Database 

    String[] columns = new String[]{KEY_ROWID, KEY_NAME, KEY_CATEGORY, KEY_DESCRIPTION}; 
    Cursor cursor = mydatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
    return cursor; 


    } 

public Cursor query2() { 
    // Open Database 

    String[] columns = new String[]{KEY_ROWID2, fKEY_ROWID2, KEY_NAME2}; 
    Cursor cursor = mydatabase.query(DATABASE_TABLE2, columns, null, null, null, null, null); 
    return cursor; 


    } 

public Cursor fetchRow(long rowId) throws SQLException { 
    Cursor mCursor = mydatabase.query(true, DATABASE_TABLE, new String[] { KEY_ROWID, KEY_NAME, 
      KEY_CATEGORY, KEY_DESCRIPTION }, KEY_ROWID + "=" 
      + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 


public boolean updateRecipe(long rowId, String RecipeName, 
     String RecipeCategory, String RecipeDescription) 
      { 
       ContentValues args = new ContentValues(); 
       args.put(KEY_NAME, RecipeName); 
       args.put(KEY_DESCRIPTION, RecipeDescription); 
       args.put(KEY_CATEGORY, RecipeCategory); 

       return mydatabase.update(DATABASE_TABLE, args, 
           KEY_ROWID + "=" + rowId, null) > 0; 
      } 
     } 

があり、これはエラーでは「いいえ、そのようなテーブル」、入って来ましたさ。何か案は?

+0

あなたは、外部SQLiteのユーティリティを使用してデータベースファイルを見てみてください、とありますどのようなテーブルを参照しましたか? – zmbq

+0

あなたはこの新しいテーブルを後で追加しましたか?まず、あなたは1つのテーブルだけでアプリケーションを操作した後、この新しいテーブルを後で追加しましたか? – havexz

+0

@havexzはいこれは私がやったことですか?ワットはそれを投げているのですか? – aspiringCoder

答えて

1

ここに問題がありますが、それは少し愚かに見えます。問題は、データベースを作成するためのonCreateが呼び出されていないことです。私は確信していますが、あなたはそれを確認できます。あなたのonUpgradeも呼び出されていません。理由はDBが既に存在するのでonCreateはコールしません。今あなたはonUpgradeが呼び出されると思うが、変更されていないとして呼び出されることはないDATABASE_VERSION

解像度:

  • コマンドユーティリティ「ADB shell`またはファイルエクスプローラを使って日食のいずれかを介してデータベースを削除してください。データベースは '/ data/data // databases'にあります。 adbの使用のために

rm <db_name>

その他の解像度いくつかのデータは、(あなたがテストのために残しておきたいということ)がすでにある場合は、このテストの目的だけのために:

  • は、他の何かにDATABASE_VERSIONを変更してみてくださいその現在の値よりも大きい。これにより、あなたのonUpgradeが呼び出されるので、データを失わないようにsqlsを書いてください。しかし明らかにあなたの生産onUpgradeはこれとは異なるでしょう。
+0

hmm私はadbを使ってみました...私のpkgデータベースをブラウズして、そこから削除しました:-)私の質問に答えました。 – aspiringCoder

2

これは、テスト目的であって生産的なコードではない場合、この行は、アプリケーションを起動するたびにdbが作成されていることを確認するのに役立ちます。 (あなたの問題が最も可能性が高いのonCreateに関連しているように、すべてで呼び出されていないが、代わりに....ちょうど推測しかし、あなたは確かに知った後、ブレークポイントを設定しONUPGRADE)

context.deleteDatabase(DATABASE_NAME) ;

public DBHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     context.deleteDatabase(DATABASE_NAME); 
    }