2015-06-14 2 views
1

Я пытаюсь создать и вставить строки в таблицу SQLite. Тем не менее, я получаю сообщение об ошибке при вставке строк, которые не существуют в таблице. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь? Благодаря!Таблица SQLite SQL не существует

Код в деятельности, который вызывает класс для создания базы данных и вставить строки следующим образом:

// Open database 
    db = new DBAdapter(this); 
    db.open(); 

    // TODO: insertRecept statements hieronder verwijderen 
    // Dienen enkel voor test om inhoud te hebben 
    long id = db.insertRecept("aardappelen - bloemkool - kotelet"); 
    id = db.insertRecept("rijst - wokgroenten - scampi - currysaus"); 
    id = db.insertRecept("nasi goreng - omelet"); 
    id = db.insertRecept("ebly - veggieburger - provencaalse saus"); 
    id = db.insertRecept("rijst - kipfilet - zoetzure saus"); 
    id = db.insertRecept("ebly - veggieburger - provencaalse saus"); 
    id = db.insertRecept("puree - fish-sticks - spinazie"); 
    id = db.insertRecept("tortellini - kaassaus"); 
    id = db.insertRecept("aardappelen - bloemkool - chippolata"); 
    id = db.insertRecept("pizza"); 
    id = db.insertRecept("frietjes"); 
    id = db.insertRecept("aardappel - zalm - prei - melksaus"); 
    db.close(); 

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

package be.bertcarremans.weekmenu; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.DatabaseUtils; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

import java.sql.SQLException; 

public class DBAdapter { 
static final String KEY_ROWID = "_id"; 
static final String KEY_RECEPT_TITEL = "recept_titel"; 
static final String TAG = "DBAdapter"; 

static final String DATABASE_NAME = "recepten_db"; 
static final String DATABASE_TABLE = "recepten"; 
static final int DATABASE_VERSION = 1; 

static final String DATABASE_CREATE = 
     "CREATE TABLE recepten (_id INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + "recept_titel TEXT NOT NULL);"; 

DatabaseHelper DBHelper; 
SQLiteDatabase db; 

final Context context; 

// Constructor 
public DBAdapter(Context ctx) { 
    this.context = ctx; 
    DBHelper = new DatabaseHelper(context); 
} 

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

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

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS recepten"); 
    } 
} 

// database openen 
public DBAdapter open() { 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

// database sluiten 
public void close() { 
    DBHelper.close(); 
} 

// recept toevoegen 
public long insertRecept(String recept) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_RECEPT_TITEL, recept); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 
} 
+1

ли вы изменить структуру таблицы , в ваших экспериментах? Потому что ваш 'onUpgrade()' не подходит. Он должен воссоздать отложенную таблицу. И вам нужно определить константу DATABASE_VERSION, которая будет увеличиваться при обновлениях, чтобы этот метод срабатывал. –

+1

Удалите и переустановите приложение или очистите его в диспетчере приложений, чтобы избавиться от файла базы данных и заново создать его с помощью вашего текущего кода. Приращение версии базы данных не поможет, так как ваш 'onUpgrade()' глючит. http://stackoverflow.com/questions/21881992/when-is-sqliteopenhelper-oncreate-onupgrade-run – laalto

ответ

2

Он смотрит вам больше всего скорее всего, изменили структуру схемы и, скорее всего, столкнулись с номером версии вашей базы данных. Это, в сочетании с нарушенной версией onUpgrade(), вызвало ваши проблемы.

В качестве быстрого решения: удалите приложение и установите его снова - это полностью уничтожит базу данных и сделает ваше приложение созданным в 1-й перспективе. Но в качестве долгосрочного решения вам необходимо исправить onUpgrade(). Прямо сейчас вы это делаете:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS recepten"); 
} 

так на человеческом языке гласит: «когда нам нужно обновить, просто вытирать стол». Как насчет воссоздания этого после этого? Если вы этого не сделаете, у вас нет стола. Если вы не получили никаких планов, чтобы иметь код обновления, то я бы пошевелить удаление таблицы/код создания в (соответственно), т.е. createTables()/removeTables() методы и просто сделать мой onUpgrade() использовать:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    removeTables(db); 
    createTables(db); 
} 
+0

вы также можете вызвать onCreate (db) вместо создания нового метода createTable(). – Hatim

+0

, вы закончите дублирование кода без отдельного метода, как вам нужно, по крайней мере в двух случаях –

 Смежные вопросы

  • Нет связанных вопросов^_^