android - SQLite rawQuery вызывает проблемы - PullRequest
0 голосов
/ 21 января 2012

размещенный ниже код, с которым у меня проблемы. Я сузил вопрос до заявления cursor = db.rawQuery().

Почему утверждение неверно? Настройка базы данных кажется правильной, но я не могу запросить ее. Я пробовал и db.query() и db.rawQuery().

Поскольку приложение просто падает при запуске на физическом устройстве (Motorola Atrix, который я использую для тестирования), возможно ли, что некоторые модели не поставляются с SQLite?

public class Database {
    private static final String ID_DATE = "id_date";
    private static final String ROUND = "round";
    private static final String CATEGORY = "category";
    private static final String VALUE = "value";
    private static final String ANSWER = "answer";
    private static final String QUESTION = "question";
    private static final String DB_NAME = "database.db";
    private static final String DB_TABLE = "clues";
    private static final String DB_PATH = "/data/data/es.foo.bar/databases/" + DB_NAME;
    private static final int DB_VERSION = 1;
    private static class DatabaseHelper extends SQLiteOpenHelper {
        private Context c = null;
        DatabaseHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
            this.c = context;
        }
        public void onCreate(SQLiteDatabase db) {
            try {
                InputStream is = c.getAssets().open(DB_NAME);
                OutputStream os = new FileOutputStream(DB_PATH);
                byte[] buffer = new byte[1024];
                while (is.read(buffer) > 0) {
                    os.write(buffer);
                }
                os.flush();
                os.close();
                is.close();
            } catch (java.io.IOException ex) {  }
        }
        public void onUpgrade(SQLiteDatabase db, int old_v, int new_v) {
        }
    }
    private final Context context;
    private DatabaseHelper helpme;
    private SQLiteDatabase db = null;
    public Database(Context c) {
        this.context = c;
    }
    public Database open() throws SQLException {
        helpme = new DatabaseHelper(context);
        db = helpme.getWritableDatabase();
        return this;
    }
    public void close() { helpme.close(); }
    public boolean askfordata() {
        Cursor cursor = null;
        cursor = db.rawQuery("select * from clues where question match \'foo\'", null);
        if (cursor != null) {
            return true;
        }
        return false;
    }
}

и основное (и единственное) действие для приложения:

public class Main extends Activity {
    Database db = null;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView hw = (TextView) findViewById(R.id.helloworld);
        db = new Database(this);
        db.open();
        if (db != null) {
            if (db.askfordata()) hw.setText("Worked.");
        }
    }
    public void onDestroy() {
        db.close();
        super.onDestroy();
    }
}

Выход ADB logcat:

01-20 23:35:27.183 22155 22155 E AndroidRuntime: FATAL EXCEPTION: main 01-20 23:35:27.183 22155 22155 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{es.foo.bar/es.foo.bar.Main}: android.database.sqlite.SQLiteException: no such table: clues: , while compiling: select * from clues where question match 'foo'

Значит ли это, что мой стол никогда не создавался? Я переместил свой стол из папки /assets/ в нужное место методом onCreate. Я могу использовать sqlite3 для просмотра файла .db на моем компьютере и перечисления там таблиц. Это показывает все мои таблицы:

clues clues_content clues_segdir clues_segments

Примечание: я пропустил import с, чтобы сэкономить место. Заранее спасибо за любые идеи.

Ответы [ 2 ]

1 голос
/ 21 января 2012

см. http://www.sqlite.org/lang_createtable.html

    Cursor cursor = null;
    cursor = db.rawQuery("CREATE TABLE IF NOT EXISTS clues (question TEXT, answer TEXT)", null);
    if (cursor != null) {
        return true;
    }
    return false;

требуется для создания таблицы

0 голосов
/ 21 января 2012

Вы проверили базу данных в своей папке активов, чтобы убедиться, что она была создана правильно?Вы можете быстро посмотреть на это с помощью такого инструмента, как Sqlite плагин для Firefox

Обновление

Изменить этот код:

InputStream is = c.getAssets().open(DB_NAME);
OutputStream os = new FileOutputStream(DB_PATH);

быть:

InputStream is = c.getAssets().open(DB_NAME);
this.getReadableDatabase();
OutputStream os = new FileOutputStream(DB_PATH);

Я думаю, что ваша копия не работает, вы просто пропустили ее в журналах.Удалите приложение, прежде чем пытаться снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...