Android开放数据库路径显然不正确

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

我正在尝试使用一个现有的数据库,并且刚刚意识到我有一个非常简单的问题,尽管答案可能不那么简单:

-这个应用程序叫做myApp -出于某些原因,eclipse调用该包如下: 包com.example.myapp

-db称为nn.sqlite -数据库位于资产文件夹中

但是,当我尝试使用我认为正确的路径打开它时,我得到:

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);
        }

    }
}