Android开放数据库路径显然不正确
我正在尝试使用一个现有的数据库,并且刚刚意识到我有一个非常简单的问题,尽管答案可能不那么简单: -这个应用程序叫做myApp -出于某些原因,eclipse调用该包如下: 包com.example.myapp -db称为nn.sqlite -数据库位于资产文件夹中 但是,当我尝试使用我认为正确的路径打开它时,我得到:Android开放数据库路径显然不正确,android,sqlite,path,Android,Sqlite,Path,我正在尝试使用一个现有的数据库,并且刚刚意识到我有一个非常简单的问题,尽管答案可能不那么简单: -这个应用程序叫做myApp -出于某些原因,eclipse调用该包如下: 包com.example.myapp -db称为nn.sqlite -数据库位于资产文件夹中 但是,当我尝试使用我认为正确的路径打开它时,我得到: 09-22 18:48:33.180: I/System.out(838): java.io.FileNotFoundException: /data/data/com.examp
09-22 18:48:33.180: I/System.out(838): java.io.FileNotFoundException: /data/data/com.example.myApp/databases/nn
我分别用myapp而不是myapp尝试了路径,但没有成功
我的道路似乎错了
我能做些什么来处理这个问题,或者更确切地说,如何找到正确的路径
有人暗示我应该先复制我的数据库-据我所知,我已经在这样做了,下面是代码:
package com.example.myapp;
public class Helper extends SQLiteOpenHelper
{
private static String path = "/data/data/com.example.myapp/databases/";
private static String db = "nn";
private static String dbpath = path + db;
private SQLiteDatabase myDB;
private Context con;
public Helper(Context context) {
super(context, db, null, 1);
this.con = context;
}
public Context getContext(){
return this.con;
}
public void createDataBase() throws IOException{
if(!checkDataBase()){
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
System.out.println("no Database");
}
}
}
private boolean checkDataBase() {
SQLiteDatabase checkDB = null;
try{
checkDB = SQLiteDatabase.openDatabase(dbpath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
}
if(checkDB != null){
checkDB.close();
return true;
} else {return false;}
}
private void copyDataBase() throws IOException {
InputStream myInput = con.getAssets().open(db);
OutputStream myOutput = new FileOutputStream(dbpath);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
myDB = SQLiteDatabase.openDatabase(dbpath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDB != null)
myDB.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
是否有我省略的其他类型的复制?尝试InputStream input=getAssets().open(“YourDatabase.sqlite”) 您不使用此代码创建数据库。。。没有sql创建。。。试着用以下方法解决这个问题:
class MyDatabase extends SQLiteOpenHelper {
public MyDatabase() {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = String.format("create table %s "
+ "(%s int primary key, %s text)",
TABLE_NAME,
A_IDD, A_FIELD);
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop if exist " + TABLE_NAME);
onCreate(db);
}
}
}
我不太确定我是否应该在这里回答这个问题,因为我从另一个问题中得到了答案 但是,我使用了sqliteOpenAssetHelper。
很好地工作。我应该在哪里尝试,或者更确切地说,应该在哪里尝试?是的,这可以让您访问资产文件夹中的现有数据库。如果您在这方面运气不佳,请尝试检查您是否在正确的路径(资产文件夹)中创建数据库,如果您是通过编程方式创建数据库的……好吧……这是我的问题,如何找到正确的路径?直接在资产中读取数据库是不可能的。为了便于阅读,您需要将其再次存储在localstorage中。我建议您执行类似布尔dbexist=checkdatabase()的操作;因此,您知道资产文件夹是否包含内容是的,如果它无法读取,那么在创建数据库时可能会出现问题。请给出代码,以便我能进一步理解。我会尽力帮助我现在没有eclipse您是说我不应该使用.sqlite文件吗?我是说您必须将数据库从资产复制到外部内存或内部(如果您这样做,您尝试使用的数据\数据路径)(希望您尝试读到我给您的链接中最上等的答案)显示您的源代码Mike和我试图告诉您必须将数据库(不是文字,而是代码)以编程方式复制到内部或外部存储,然后您可以打开它。资产中的数据库文件夹无法直接读取,因此您必须将其复制到其他地方,然后尝试读取/查询任何内容。现在谷歌离开(提示:“如何从资产文件夹复制数据库”"!我的想法是像您在onCreate方法中对每个表所做的那样吗?另外,我不确定您的解决方案如何解释我的filenotfoundexception。是吗?还有,A_IDD是什么?A_IDD和A_字段是表table_NAME中的两个字段。这些是您应该在db类中声明和初始化的最终字符串。是的,我想说您是当然,当您没有在试图打开数据库的位置创建数据库时,您没有发现异常文件。如果您真的尝试一些东西,我将不胜感激…这对我来说已经足够好了,新手我尝试过了…也就是说,我尝试过几件事。SqliteOpenAssetHelper做到了,如果它有帮助的话
class MyDatabase extends SQLiteOpenHelper {
public MyDatabase() {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = String.format("create table %s "
+ "(%s int primary key, %s text)",
TABLE_NAME,
A_IDD, A_FIELD);
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop if exist " + TABLE_NAME);
onCreate(db);
}
}
}