Проблема с подключением второй БД

388
29 января 2017, 13:18

У меня была одна БД, потом пришлось создать еще одну для других целей. После создания поменял DATEBASE_VERSION, но все ровно ошибка:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.fedia.regestration, PID: 2593
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app.MainActivity}: android.database.sqlite.SQLiteException: table Contact already exists (code 1): , while compiling: CREATE TABLE Contact ( Name TEXT, Color TEXT, Price TEXT)
    Caused by: android.database.sqlite.SQLiteException: table ContactFruit already exists (code 1): , while compiling: CREATE TABLE ContactFruit ( Name TEXT, Color TEXT, Price TEXT)

БД 1:

public static final String TAG = DBHelper.class.getSimpleName();
public static final int DATEBASE_VERSION = 3;
public static final String DATEBASE_NAME = "ContactDB";
public static final String TABLE_CONTACT = "Contact";
public static final String KEY_ID = "ID";
public static final String KEY_NAME = "Name";
public static final String KEY_LOGIN = "Login";
public static final String KEY_PASS = "Pass";
public int countUser;
public DBHelper(Context context) {
    super(context, DATEBASE_NAME, null, DATEBASE_VERSION);
}
public static final String CREATE_TABLE_USERS = "CREATE TABLE " + TABLE_CONTACT + " ( "
        + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + KEY_NAME + " TEXT, "
        + KEY_LOGIN + " TEXT, "
        + KEY_PASS + " TEXT)";
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_USERS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT);
    onCreate(db);
}

БД 2:

public static final int DATEBASE_VERSION = 3;
public static final String DATEBASE_NAME_FRUIT = "FruitBD";
public static final String TABLE_CONTACT_FRUIT = "ContactFruit";
public static final String KEY_NAME_FRUIT = "Name";
public static final String KEY_COLOR = "Color";
public static final String KEY_PRICE = "Price";
public DBHelperFruit(Context context) {
    super(context, DATEBASE_NAME_FRUIT, null, DATEBASE_VERSION);
}
public static final String CREATE_TABLE_FRUIT = "CREATE TABLE " + TABLE_CONTACT_FRUIT + " ( "
        + KEY_NAME_FRUIT + " TEXT, "
        + KEY_COLOR + " TEXT, "
        + KEY_PRICE + " TEXT)";
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_FRUIT);
    onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACT_FRUIT);
    onCreate(db);
}

В ошибке еще указано, что проблема и в этом методе:

@Override
public List<Fruit> getAllFruits() {
    List<Fruit> fruitList = new ArrayList<Fruit>();
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACT_FRUIT;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            Fruit fruit = new Fruit();
            fruit.setName(cursor.getString(0));
            fruit.setColor(cursor.getString(1));
            fruit.setPrice(Integer.parseInt(cursor.getString(2)));
            fruitList.add(fruit);
        } while (cursor.moveToNext());
    }
    return fruitList;
}
Answer 1

Метод onCreate(...) вызывается при создании базы данных и служит для ее конфигурации (создания таблиц и т.п.).

У Вас этот метод выглядит следующим образом:

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

В этом методе Вы создаете таблицу и зачем-то снова явно вызываете метод onCreate(...), создавая рекурсию. При этом повторно выполняется запрос на создание таблицы, который и вызывает исключение:

SQLiteException: table ContactFruit already exists

так как данная таблица уже существует (была создана при первом вызове метода onCreate(...)).

Решить данную проблему можно убрав вызов onCreate(db); из метода onCreate(...).

READ ALSO
Вложенный оператор switch

Вложенный оператор switch

Объясните пожалуйста в чём ошибка

434
Часть переключателей MPC-HC не работает при создание процесса ProcessBuilder&#39;м

Часть переключателей MPC-HC не работает при создание процесса ProcessBuilder'м

Класс в котором формируется объект ProcessBuilder:

460
ViewPager и RecyclerView получить текущий list

ViewPager и RecyclerView получить текущий list

Есть ViewPager в котором RecyclerView формируется список, используется FragmentStatePagerAdapter который сразу формирует несколько фрагментовСитуация такая,...

375
java swing jbutton

java swing jbutton

Доброй ночиРисую линию из квадратов jbutton на jpanel, когда собирается - линию убираю, jbutton - те что выше отпускаю

399