Android - открыть базу данных SQLite - PullRequest
1 голос
/ 06 марта 2012

Я хотел бы открыть базу данных и получить от нее данные. Я прочитал учебник об этом и сделал заявку. Я пытаюсь проверить, существует ли база данных, если нет, создайте новую базу данных в системном пути Android по умолчанию для базы данных приложения и скопируйте туда данные из базы данных (которая находится в папке активов). Но когда я запускаю приложение, я получил ошибку:

SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase$CursorFactory, String, String[], String) line: 1568   

Может кто-нибудь дать мне совет о том, что я сделал неправильно? Вот код:

package thesis.app.quiz;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelperForQuiz extends SQLiteOpenHelper {

    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/thesis.app.quiz/databases/";
    private static String DB_NAME = "QuizDB";
    private SQLiteDatabase myDataBase;
    private final Context myContext;

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

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }

    public void openDataBase() {


        String myDbPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myDbPath, null,
                SQLiteDatabase.OPEN_READONLY);
    }

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

    public List<Question> getQuestionsList(int difficulty, int numberOfQuestions) {



        List<Question> questionsList = new ArrayList<Question>();

        Cursor c = myDataBase.rawQuery("SELECT * FROM questions", null);

        while (c.moveToNext()) {
            Question q = new Question();
            q.setQuestionText(c.getString(1));
            q.setRightAnswer(c.getString(2));
            q.setAnswerOption1(c.getString(3));
            q.setAnswerOption2(c.getString(4));
            q.setAnswerOption3(c.getString(5));
            q.setQuestionDiffLevel(difficulty);
            questionsList.add(q);
        }

        return questionsList;

    }

    public void createDataBase() throws IOException {

        if (!checkIfDBAlredyExist()) {

            this.getReadableDatabase(); 

            try {
                InputStream myInput = myContext.getAssets().open(DB_NAME);

                String newDbPath = DB_PATH + DB_NAME; 
                OutputStream myOutput = new FileOutputStream(newDbPath);

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

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

            } catch (IOException e) {

                e.printStackTrace();
                throw new Error("Error copying database");
            }

        }

    }

    public boolean checkIfDBAlredyExist() {


        SQLiteDatabase tmpDb = null;
        String dbPath = DB_PATH + DB_NAME;
        try {
            tmpDb = SQLiteDatabase.openDatabase(dbPath, null,
                    SQLiteDatabase.OPEN_READONLY);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        if (tmpDb != null) {
            tmpDb.close();
            //return true;
        }

        return tmpDb != null ? true : false;
    }
}

Ответы [ 2 ]

1 голос
/ 30 декабря 2013

Вам не нужно этого делать.

Прелесть родительского класса SQLiteOpenHelper в том, что он автоматически проверяет, существует ли база данных или нет.

Вызов getReadableDatabase () или getWritableDatabase () сделает следующее до возврата читаемого или доступного для записи объекта SQLiteDatabase:

  1. Если база данных не существует, она вызовет OnCreate (). Здесь вы должны написать код для создания таблицы и инициализации при необходимости.
  2. Если база данных нуждается в обновлении, будет вызван метод onUpgrade (). Здесь вы должны сделать все, что вам нужно, чтобы обновить таблицу в зависимости от различий версий (т. Е. Удалить / добавить столбцы)
0 голосов
/ 06 марта 2012

скопируйте это на уровне класса

private static String ASSETS_DB_FOLDER = "db";

здесь БД является объектом SQLiteDatabase.

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

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