SQLite не создает вторую таблицу - PullRequest
1 голос
/ 10 декабря 2011

У меня проблема с тем, что я хочу создать вторую таблицу в моей базе данных. Вот код

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;
            }
        }

У меня есть вызов курсора к этой базе данных для второй таблицы, это была ошибка, "нет такой таблицы". Есть идеи?

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Что ж, если это только для целей тестирования, а не для производительного кода, эта строка может помочь вам убедиться, что ваша БД создается при каждом запуске вашего приложения. (поскольку ваша проблема, скорее всего, связана с тем, что onCreate вообще не вызывается, а вместо этого onUpgrade .... хотя бы предположение, установите точку останова, тогда вы точно знаете)

context.deleteDatabase (DATABASE_NAME);

   public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        context.deleteDatabase(DATABASE_NAME); 
    }
2 голосов
/ 10 декабря 2011

Вот проблема, хотя это будет выглядеть немного глупо.Проблема в том, что ваш onCreate для создания базы данных не вызывается.Я уверен, но вы можете это подтвердить.Также ваш onUpgrade не вызывается.Причина в том, что БД уже существует, поэтому onCreate не будет звонить.Теперь вы думаете, что будет вызван onUpgrade, но он не будет вызван, поскольку вы не изменились DATABASE_VERSION.

Разрешение:

  • Удалите базу данных с помощью командной утилиты 'adbshell` или через eclipse, используя файловый менеджер.База данных находится в папке '/data/data//databases' .

Для использования adb rm <db_name>

Другое разрешение, если некоторые данные уже есть (которые вы хотите сохранитьдля тестирования), это только для целей тестирования:

  • попробуйте изменить DATABASE_VERSION на нечто иное, чем его текущее значение.Это приведет к тому, что ваш onUpgrade будет вызван, поэтому напишите ваши sqls, чтобы вы не потеряли данные.Но очевидно, что ваша продукция onUpgrade будет отличаться от этой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...