база данных Android, чтение из файла - PullRequest
0 голосов
/ 09 января 2012

Я новичок в программировании затмений и Android, у меня проблема с подключением к базе данных.Ну, я нашел много ссылок и хорошо я публикую свои 2 классаЕсли кто-то может найти ошибку.База данных, которую я имею, сделана с sqlite, и у нее есть android_metadata и таблица вопросов.Когда я запускаю в эмуляторе, у меня появляются некоторые сообщения, когда я открываю форму «О программе» Тест приложения Тест DrymVyzion (процесс dv.qtest.dvyzual) неожиданно остановился. Пожалуйста, попробуйте еще раз ».На затмении это ошибки:

01-08 22:50:42.292: E/AndroidRuntime(1059): Uncaught handler: thread main exiting due to uncaught exception
01-08 22:50:42.312: E/AndroidRuntime(1059): java.lang.RuntimeException: Unable to start activity ComponentInfo{dv.qtest.dvyzual/dv.qtest.dvyzual.About}: android.database.sqlite.SQLiteException: no such table: questions: , while compiling: SELECT _id, question, qone, qtwo, qthree, qanswer FROM questions
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.os.Looper.loop(Looper.java:123)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread.main(ActivityThread.java:4203)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at java.lang.reflect.Method.invokeNative(Native Method)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at java.lang.reflect.Method.invoke(Method.java:521)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at dalvik.system.NativeStart.main(Native Method)
01-08 22:50:42.312: E/AndroidRuntime(1059): Caused by: android.database.sqlite.SQLiteException: no such table: questions: , while compiling: SELECT _id, question, qone, qtwo, qthree, qanswer FROM questions
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1006)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:964)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1041)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at dv.qtest.dvyzual.About.getEvents(About.java:46)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at dv.qtest.dvyzual.About.onCreate(About.java:22)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
01-08 22:50:42.312: E/AndroidRuntime(1059):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)

Вот мои два класса:

quizData.java

package dv.qtest.dvyzual;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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

/** Helper to the database, manages versions and creation */
public class quizData extends SQLiteOpenHelper {
    private static final String DB_PATH = "/data/data/dv.qtest.dvyzual/databases/";
    private static final String DB_NAME = "q.db";
    private static final int DATABASE_VERSION = 1;
    private SQLiteDatabase myDataBase; 
    private final Context myContext;


    // Table name
    public static final String TABLE = "questions";

    // Columns
    public static final String qid = "_id";
    public static final String question = "question";
    public static final String qone = "qone";
    public static final String qtwo = "qtwo";
    public static final String qthree = "qthree";
    public static final String qanswer = "qanswer";

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

    public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        if(dbExist){

        }else{

            //By calling this method and empty database will be created into the default system path
            //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();

            try {
                this.close(); // testing
                copyDataBase();
            } catch (IOException e) {

                throw new Error("Error copying database");

            }
        }

    }

    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase(){

        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }catch(SQLiteException e){

            //database does't exist yet.

        }

        if(checkDB != null){

            checkDB.close();

        }

        return checkDB != null ? true : false;
    }

    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{

        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);

        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    public void openDataBase() throws SQLException{

        //Open the database
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

            if(myDataBase != null)
                myDataBase.close();

            super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }

}

О.java

package dv.qtest.dvyzual;


import java.io.IOException;

import android.app.Activity;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.TextView;

public class About extends Activity {
     /** Called when the activity is first created. */
     private quizData eventsData = new quizData(About.this);

     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.about);
        Cursor cursor = getEvents();
        showEvents(cursor);

    try {
        eventsData.createDataBase();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        eventsData.openDataBase();
    }catch(SQLException sqle){
        throw sqle;
    }

     }

      @Override
      public void onDestroy() {
        eventsData.close();
      }

      private Cursor getEvents() {
            SQLiteDatabase db = eventsData.getReadableDatabase();
            Cursor cursor = db.query("questions", new String[]{"_id","question","qone", "qtwo", "qthree", "qanswer"}, null, null, null, null, null);
            startManagingCursor(cursor);
            return cursor;
      }      

      private void showEvents(Cursor cursor) {
            StringBuilder ret = new StringBuilder("Saved Events:\n\n");
            while (cursor.moveToNext()) {
              long id = cursor.getLong(0);
              String q = cursor.getString(1);
              String q1 = cursor.getString(2);
              ret.append(id + ": " + q + ": " + q1 + "\n");
            }

            TextView tv = new TextView(this);
            tv.setText(ret);
            setContentView(tv);
          }

     }

Пожалуйста, помогите, если кто-то может найти то, что я делаю неправильно, я пытаюсь столько часов!Кстати, это работает для баз данных не из файла без пути к БД.Так может проблема в том, что я не правильно настроил помощника по БД?Есть идеи?

1 Ответ

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

В своей деятельности О программе вы звоните getEvents(), прежде чем позвонить eventsData.createDataBase(). Это попытается получить доступ к базе данных, прежде чем она существует. Я думаю, что если вы измените порядок вызовов в onCreate, это может сработать (исключая другие проблемы):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.about);

    try {
        eventsData.createDataBase();
    } catch (IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        eventsData.openDataBase();
    } catch(SQLException sqle){
        throw sqle;
    }
    Cursor cursor = getEvents();
    showEvents(cursor);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...