2011-12-09 50 views
0

我有一个问题,我想在我的数据库中创建第二个表。下面是代码SQLite不创建第二张表

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

您是否稍后添加了此新表格...我的意思是首先您只使用一个表格与应用程序一起工作,然后再添加此新表格? – havexz

+0

@havexz是的,这是我所做的?那笏正在扔它吗? – aspiringCoder

回答

1

这是问题,它看起来有点愚蠢。问题是您的onCreate创建数据库没有被调用。我相信,但你可以证实这一点。您的onUpgrade也没有被调用。原因是DB已经存在,所以onCreate不会打电话。现在你认为onUpgrade将被调用,但不会被调用,因为你没有改变DATABASE_VERSION

分辨率:

  • 删除数据库或者通过命令效用“使用的文件浏览ADB shell`或通过蚀。数据库驻留在'/ data/data // databases'下。

亚行使用rm <db_name>

如果一些数据已经存在(要保留用于测试),这仅用于测试目的其他分辨率:

  • 尝试改变DATABASE_VERSION到其他的东西比目前的价值。这会导致你的onUpgrade被调用,所以写你的sqls,这样你就不会丢失数据。但显然你的生产onUpgrade将不同于这一个。
+0

嗯我尝试使用adb ...浏览到我的pkg数据库...并从那里删除它:-)谢谢回答我的问题 – aspiringCoder

2

那么,如果这只是为了测试目的而不是生产性代码,那么这一行可能会帮助您确保每次启动应用程序时创建数据库。 (因为你的问题最有可能与onCreate根本没有被调用有关,但onUpgrade改为...只是一个猜测,设置一个断点,然后你肯定知道)

context.deleteDatabase(DATABASE_NAME) ;

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