Такой таблицы не существует -Sqlite ошибка при записи в базу данных в Android - PullRequest
1 голос
/ 16 марта 2012

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

DBH = new DatabaseHelper(this);
    try {
        DBH.createDataBase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    DBH.getWritableDatabase().rawQuery("insert into profile (_id, FirstName) values (1, 'Dave')", null);
    DBH.close();

DBH - это мой вспомогательный класс базы данных, и он отлично создает базу данных, и яЯ даже смог прочитать из базы данных, так что я знаю, что там.Таблица, в которую я пытаюсь записать, является профильной, и я уверен, что она действительно существует, но каждый раз, когда я запускаю ее, я получаю эту ошибку:

sqlite returned: error code = 1, msg = no such table: profile

Я пытался читать из этой таблицы и былв состоянии получить результаты, так что я в значительной степени озадачен.У кого-нибудь есть идеи?

Редактировать: По запросу это мой класс помощника по базам данных

public class DatabaseHelper extends SQLiteOpenHelper {

private static String DB_PATH = "/data/data/com.ProjectZeus.FitnessWire/databases/";
private static String DB_NAME = "fitnesswire.db";
private SQLiteDatabase myDB;
private Context  myContext;

public DatabaseHelper(Context context) {
    super(context,DB_NAME, null, 1);
    this.myContext = context;   
}

public void createDataBase() throws IOException{
    boolean check = checkDataBase();
    if(check){
        //Log.e("Check", "Database exists");
    }else{
        this.getReadableDatabase();

        try{
            copyDataBase();
        }catch(Exception e){
            throw new Error("Error copying database");
        }
    }
}


private void copyDataBase() throws IOException {
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    String outFileName = DB_PATH + DB_NAME;

    OutputStream myOutput = new FileOutputStream(outFileName);

    byte [] buffer = new byte[1024];
    int length;
    while((length = myInput.read(buffer))>0){
        myOutput.write(buffer,0,length);
    }

    myOutput.flush();
    myOutput.close();
    myInput.close();

}

private boolean checkDataBase() {
    SQLiteDatabase checkdb = null;
    try{
        String myPath= DB_PATH + DB_NAME;
        checkdb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }catch(SQLiteException e){
        Log.e("checkDataBase()", "Database doesntexist yet");
    }

    if(checkdb != null){
        checkdb.close();
    }

    return checkdb != null ? true : false ;
}

public void openDataBase() throws SQLException {
    String myPath = DB_PATH + DB_NAME;
    myDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}

@Override
public synchronized void close(){
    if(myDB != null){
        myDB.close();
    }
    super.close();
}

@Override
public void onCreate(SQLiteDatabase db) {


}

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

}

}

Ответы [ 3 ]

0 голосов
/ 16 марта 2012

Эта ошибка также может возникать, когда столбец не существует (я знаю, он не идеален, но так оно и есть).Поэтому убедитесь, что в вашей таблице есть столбцы с именами _id и FirstName.

0 голосов
/ 20 марта 2012

Вы должны использовать db.execSQL() вместо db.rawQuery(), так как вставка не является запросом (только SELECT is)

В rawQuery() происходит много магии - он может изменить инструкцию перед выполнением в базе данных, а также попытаться построить Cursor из результата. Некоторая часть в этом процессе, кажется, терпит неудачу.

0 голосов
/ 16 марта 2012

Это иногда случается и в Iphone ... База данных неправильно подключена.

Что мы делаем (это работает для нас), так это то, что мы удаляем все проекты из симулятора. Очистим проект и скомпилируем его ...

Я не уверен, что это работает в Android, но вы можете попробовать то же самое

Приветствия

...