繁体   English   中英

android数据库,从文件读取

[英]android database, reading from file

我是eclipse和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);
          }

     }

如果有人能找到我做错的地方,请帮忙,我正在努力很多小时! 顺便说一下,它适用于数据库,而不是没有DB路径的文件。 所以也许问题是我没有正确设置数据库帮助程序? 有任何想法吗?

在About活动中,您eventsData.createDataBase()调用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM