2012-03-06 178 views
1

我想打开一个数据库并从中获取数据。我读了一篇关于这个教程的教程并提出了一个应用我试图检查数据库是否存在,如果不存在,请在应用程序数据库的Android默认系统路径中创建一个新数据库,并将数据从数据库复制到那里(位于资产文件夹中)。但是当我运行的应用程序时,我得到了错误:Android - 打开SQLite数据库

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; 
    } 
} 
+0

这看起来不像实际的错误 - 你能发布更多的堆栈跟踪吗? – 2012-03-06 11:56:45

+0

请发帖LogCat输出 – Asahi 2012-03-06 11:58:13

+0

对不起,对于迟到的答案。我保存了LogCat输出,并且我注意到了一些事情,所以我试图弄清楚一些事情。也许我可以解决这个问题。我不想浪费你的时间。如果我再次失败,我会在这里复制日志。 – user1036555 2012-03-06 20:49:49

回答

1

你不需要那样做。

SQLiteOpenHelper父类的美妙之处在于它自动检查数据库是否已经存在。

到getReadableDatabase()或getWritableDatabase(A呼叫)将执行以下操作之前返回可读或可写的SQLiteDatabase对象:

  1. 如果数据库中不存在,它会调用的OnCreate()。这是您应该编写代码来创建表并在需要时进行初始化的地方。
  2. 如果数据库需要升级,将调用onUpgrade()方法。这是你应该根据版本差异如何升级表的地方(即删除/添加列)
0

拷贝类级别

private static String ASSETS_DB_FOLDER = "db";

这里的db是SQLiteDatabase的对象。

确保数据库的名称与您在代码(类)中编写的名称相同。

+0

我试过这个,但我已经得到了同样的力量。 – user1036555 2012-03-06 20:44:21