2013-03-04 2 views
1

Мой код теперь выглядит следующим образом:нет такой таблицы исключений SQLite

Главное приложение Java:

String TAG = "DATABASES";  
    try { 

     String destPath = "/data/data/" + getPackageName() 
       + "/databases/data.db"; 

     File f = new File(destPath); 
     if(!f.exists()){ 
      Log.v(TAG,"Dest DB doesn't exist"); 
      InputStream in = getAssets().open("airports.db"); 
      OutputStream out = new FileOutputStream(destPath); 

      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = in.read(buffer)) > 0) { 
       out.write(buffer, 0, length); 
      } 
      in.close(); 
      out.close(); 
     } else { 
      Log.v(TAG,"File exists: " + destPath); 

     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.v(TAG,"ioexeption"); 
     e.printStackTrace(); 
    } 

    DBManager dbManager = new DBManager(this); 
    Log.v(TAG,"Database is there with version: "+dbManager.getReadableDatabase().getVersion()); 
    //String sql = "select * from airports where IATA='GRO' "; 
    String sql = "select count(*) from airports"; 


    SQLiteDatabase db = dbManager.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(sql, null); 
    Log.v(TAG,"Query Result:"+cursor); 


    cursor.close(); 
    db.close(); 
    dbManager.close(); 

Мой DBManager.java:

package com.jammo.mywidget4; 

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

public class DBManager extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String TAG = "DATABASES"; 

public DBManager(Context context) { 
    super(context, "data.db", null, DATABASE_VERSION); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    Log.v(TAG,"On create Called:"+db.getPath()); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 
} 

теперь пробеги выполнения ok в main.java при запуске «db», однако сбой на следующей строке, где он пытается выполнить rawQuery()

FYI «выберите счет (*) из аэропортов« запустите на моем графическом интерфейсе Sqlite DB Manager возвращает 1650 строк.

Журнал ошибок говорят:

03-04 21:54:24.200: E/AndroidRuntime(11513): FATAL EXCEPTION: main 
03-04 21:54:24.200: E/AndroidRuntime(11513): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jammo.mywidget4/com.jammo.mywidget4.SectorInfo}: android.database.sqlite.SQLiteException: no such table: airports: , while compiling: select count(*) from airports 

Местный /assets/airports.db "кажется", который обнаруживается и копируется в /data/data/mypackage/databases/data.db как «файл найден»

Большое спасибо J

+0

Возможный дубликат [Android sqlite rowcount всегда равен нулю?] (Http://stackoverflow.com/questions/15208954/android-sqlite-rowcount-is-always-zero) –

+0

Измените свой предыдущий вопрос вместо того, чтобы открывать новый –

+0

Извините, мне сообщили в моей последней ветке, чтобы открыть новую, с новым кодом и новыми сообщениями об ошибке – Jammo

ответ

2

Попробуйте без использования класса DBManager.

Закомментируйте этой линии ...

DBManager dbManager = new DBManager(this); 

... затем открыть базу данных в явном виде, заменив эту строку ...

SQLiteDatabase db = dbManager.getReadableDatabase(); 

... с ...

SQLiteDatabase db = SQLiteDatabase.openDatabase(destPath, null, SQLiteDatabase.OPEN_READONLY); 

Затем очистите данные приложения, чтобы база данных была скопирована из вашего каталога assets.

EDIT: Даже если мое предложение работало, на самом деле это просто обходной путь и корень вашей проблемы был это ...

String destPath = "/data/data/" + getPackageName() + "/databases/data.db"; 

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

Проблема была в том, что вы создавали/копировали вашу базу данных по этому пути, но класс DBManager предположительно создавал пустую базу данных, расположенную где-то по другому пути в файловой системе.

Чтобы исправить это для всех устройств и Android версий, перед копированием базы данных, я хотел бы использовать ...

SQLiteDatabase.openOrCreateDatabase("data.db", null) 

... создать «манекен» (пустые) базы данных. Тогда я бы назвал ...

getDatabasePath("data.db") 

... чтобы получить абсолютный путь к data.db. Затем вы можете перезаписать эту базу данных во время операции копирования, а затем вы можете использовать класс, который расширяет SQLiteOpenHelper, и он найдет правильную базу данных.

+0

Блестящий, это сделал трюк, спасибо. Я изменил условие **, если (! F.exists()) {** to **, если (! F.exists() || true) {** временно, чтобы полностью перекрыть все. Также удалено использование DBManager. Я начал получать новую ошибку «таблица Android_metadata не существует», поэтому я добавил, что с locale + us_EN и voila все работает. Спасибо :) – Jammo

+0

@Jammo: Рад, что я мог бы помочь. См. Редактирование до конца моего ответа для объяснения и наилучшей практики для путей Android. – Squonk

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