2013-05-14 58 views
1
public class DBHelper extends SQLiteOpenHelper{ 

    //The Android's default system path of your application database. 
    private static String DB_PATH = "/data/data/com.tmm.android.chuck/databases/"; 
    private static String DB_NAME = "questionsDb"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 

    /** 
    * Constructor 
    * Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
    * @param context 
    */ 
    public DBHelper(Context context) { 
     super(context, DB_NAME, null, 1); 
     this.myContext = context; 
    } 

    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 
     if(!dbExist) 
     { 
      //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 { 
       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) { 
    } 

    // Add your public helper methods to access and get content from the database. 
    // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy 
    // to you to create adapters for your views. 




    public List<Question> getQuestionSet(int difficulty, int numQ){ 
     List<Question> questionSet = new ArrayList<Question>(); 
     Cursor c = myDataBase.rawQuery("SELECT * FROM QUESTIONS WHERE DIFFICULTY=" + difficulty + 
       " ORDER BY RANDOM() LIMIT " + numQ, null); 
     while (c.moveToNext()){ 
      //Log.d("QUESTION", "Question Found in DB: " + c.getString(1)); 
      Question q = new Question(); 
      q.setQuestion(c.getString(1)); 
      q.setAnswer(c.getString(2)); 
      q.setOption1(c.getString(3)); 
      q.setOption2(c.getString(4)); 
      q.setOption3(c.getString(5)); 
      q.setRating(difficulty); 
      questionSet.add(q); 
     } 
     return questionSet; 
    } 
} 

logcat的错误消息:Eclipse的logcat的错误:android.database.sqlite.SQLiteException:没有这样的表:

android.database.sqlite.SQLiteException: no such table: question (code 1): , while compiling: SELECT * FROM question WHERE DIFFICULTY=2 ORDER BY RANDOM() LIMIT 20 

我已经在我的资产文件夹中添加的数据库。它具有彩色标记_id,“question”,“answer”,“option1”,“option2”,“option3”,“difficulty”的表格“question”。

+1

哪里是创建表的代码? – Prachi 2013-05-14 05:08:47

+0

我必须在DBOpenHelper中创建表吗?我已经将tabl放置在资产文件夹中的数据库中。 – 2013-05-14 06:33:40

回答

0

代码引用表中的“问题”而不是“问题”在该行

Cursor c = myDataBase.rawQuery("SELECT * FROM QUESTIONS WHERE DIFFICULTY=" + difficulty + 
" ORDER BY RANDOM() LIMIT " + numQ, null); 
1

试试这个班就会对你有所帮助。

您只需要确保旧数据库当前不在您的设备中,因为您可以重新安装应用程序。

public class DatabaseHepler extends SQLiteOpenHelper{ 

public DatabaseHepler(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.myContext = context; 
     try 
     { 
      createDataBase(); 
      //BugSenseHandler.setup(this.myContext, "0670ce92"); 
      //BugSenseHandler.readLogs(); 
     } 
     catch (Exception e) 
     { 
      Log.e(TAG,"DatabaseHelper_constuctor createDataBase :" + e.fillInStackTrace()); 
     } 
    } 


    private static final String TAG = "DatabaseHelper"; 
    //Your Database Name 
    private static final String DATABASE_NAME = "questionDb.sqlite"; 
    //Your Your Database Version 
    private static final int DATABASE_VERSION = 1; 
    private final Context myContext; 
    private static SQLiteDatabase myDataBase; 
    //The Android's default system path of your application database. DB_PATH = "/data/data/YOUR_PACKAGE/databases/" 
    private static String DB_PATH = "/data/data/com.tmm.android.chuck/databases/"; 

//***************************** Constructor ***************************** 
/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
**/ 

//***************************** SQLiteOpenHelper's Methods ***************************** 
@Override 
public void onCreate(SQLiteDatabase db) { 
} 

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


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

//***************************** My DB Handler Methods ***************************** 
/** 
* Creates a empty database on the system and rewrites it with your own database. 
**/ 
public void createDataBase() throws IOException 
{ 
    boolean dbExist = checkDataBase(); 
    if(dbExist) 
    { 
     //Database already exist 
     openDataBase(); 

    } 
    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. 
     myDataBase = getWritableDatabase(); 
     try 
     { 
      copyDataBase(); 
     } 
     catch (IOException e) 
     { 
      throw new Error("Error createDataBase()."); 
     } 
    } 
} 
/** 
* 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 + DATABASE_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 
    catch(SQLiteException e) 
    { 
     //database does't exist yet. 
    } 
    if(checkDB != null) 
    { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 
/*public boolean isDataBaseExist() 
{ 
    File dbFile = new File(DB_PATH + DATABASE_NAME); 
    return dbFile.exists(); 
}*/ 

/** 
* 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 transferring bytestream. 
**/ 
private void copyDataBase() throws IOException 
{ 
    try 
    { 
     //Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open("DATABASE_NAME"); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DATABASE_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(); 
    } 
    catch (IOException e) 
    { 
     throw new Error("Error copyDataBase()."); 
    } 
} 

public void openDataBase() throws SQLException, IOException 
{ 
    try 
    { 
     //Open the database 
     String myPath = DB_PATH + DATABASE_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 
    catch (SQLiteException e) 
    { 
     throw new Error("Error openDataBase()."); 
    }  
} 

public static List<ItemClass> getAnswerList() 
{ 
    List<ItemClass> resultList = new ArrayList<ReminderItemClass>(); 
    ItemClass obj; 
    Cursor cursor; 
    String query; 

    query = "SELECT * FROM tblName"; 
    try 
    { 
     cursor = myDataBase.rawQuery(query,null); 
     if(cursor != null) 
     { 

      while(cursor.moveToNext()) 
      { 
       obj=new ReminderItemClass(); 
       obj.id=cursor.getString(0); 
       obj.title=cursor.getString(1); 
       . 
      . 
       resultList.add(obj); 
      } 
     } 
     cursor.deactivate(); 


    } 
    catch (Exception e) 
    { 
     Log.e(TAG,"Error : " + e.fillInStackTrace()); 

    } 
    return resultList; 
} 


} 

你没有完全通过你的编码复制数据库,如果你有任何其他问题让我知道。

希望它能解决您的问题。

+0

我对你给出的代码做了一些修改。但得到一些错误。你能给我提供你的电子邮件ID吗? – 2013-05-14 08:10:20

相关问题