我正在尝试从assets文件夹中存储的数据库中读取数据。 表名是任务。 当执行到达Cursor cursor = dbase.rawQuery(selectQuery,null)这一行我得到错误:“没有这样的表:quest” 我的桌子看起来像这样 请帮助我。
public void CopyDataBaseFromAsset() throws IOException{
InputStream in = ctx.getAssets().open(DB_NAME);
Log.e("sample", "Starting copying" );
String outputFileName = DATABASE_PATH+DATABASE_NAME;
File databaseFile = new File( "/data/data/com.example.questionsdb/databases");
// check if databases folder exists, if not create one and its subfolders
if (!databaseFile.exists()){
databaseFile.mkdir();
}
OutputStream out = new FileOutputStream(outputFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer))>0){
out.write(buffer,0,length);
}
Log.e("sample", "Completed" );
out.flush();
out.close();
in.close();
}
public void openDataBase () throws SQLException{
Log.e("Start", "openDataBase" );
String path = DATABASE_PATH+DATABASE_NAME;
dbase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
Log.e("openDataBase", "Completed" );
}
public List<Question> getAllQuestions() {
Log.e("Add Start", "msg:getAllQuestions");
List<Question> quesList = new ArrayList<Question>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_QUEST;
dbase=this.getReadableDatabase();
Cursor cursor = dbase.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Question quest = new Question();
quest.setID(cursor.getInt(0));
quest.setQUESTION(cursor.getString(1));
quest.setANSWER(cursor.getString(2));
quest.setOPTA(cursor.getString(3));
quest.setOPTB(cursor.getString(4));
quest.setOPTC(cursor.getString(5));
quest.setOPTD(cursor.getString(6));
quest.setREFTEXT(cursor.getString(7));
quesList.add(quest);
} while (cursor.moveToNext());
}
Log.e("Add End", "msg:getAllQuestions");
// return quest list
return quesList;
}
答案 0 :(得分:0)
这只是猜测,但我可以看到这里发生了三件可能的事情......
在createDatabase()方法中调用this.getReadableDatabase()会自动创建一个空数据库。 您尝试从资产文件夹复制预先创建的数据库失败或数据库被复制到错误的位置。 在步骤1(上面)中创建的空数据库是从主代码调用db.rawQuery(...)时正在查询的数据库。 为了进一步解释,查看SQLiteOpenHelper
的源代码是有用的当您创建SQLiteOpenHelper的实例时,它会设置数据库名称和版本之类的内容,但它不会创建数据库。相反,第一次调用getReadableDatabase()或getWritableDatabase()会检查数据库是否存在,以及它是否存在创建数据库。创建空数据库后,将调用onCreate(...)方法,在您的情况下,该方法不执行任何操作。
点到2点(上图) - 你说DB_PATH是/ data / data / mypackagename / databases。如果确实如此,你没有尾随/那么......
String myPath = DB_PATH + DB_NAME; ...将myPath设置为/ data / data / mypackagename / databasesligas_db。在这种情况下,即使资产副本成功,复制的数据库也不会出现在您预期的位置。
最后在第3点(上面)中,当您调用db.rawQuery(...)时,db指向的实例将由上一次调用getWritableDatabase()返回。假设资产中的副本已失败或已将其复制到不正确的路径,则db将指向在步骤1中创建的空数据库。
您得到的错误是表格不存在,并且不是表示数据库不存在的错误 - 唯一的逻辑解释是它执行查询在空数据库上,而不是从资产中复制的数据库。
我还想提一件事。使用硬编码路径到任何Android目录都不是一个好主意。例如 - 尽管在大多数设备上,创建数据库的目录将是/ data / data //数据库,但这不是保证。如果调用getDatabasePath(...)方法会更安全,因为它将返回一个File对象,该对象可用于获取Android数据库类使用的数据库目录的路径。
答案 1 :(得分:0)
我使用的db文件不正确。然后我按照链接http://pranayairan.tumblr.com/post/30319261303/shipping-sqllite-db-with-your-app下的详细信息 创建数据库。 之后,我可以将db复制到data \ data下的数据库文件夹中。 感谢