7

我有一个 android 应用程序,它应该读取和扩展已经在 sqlite 上创建的数据库...通过将数据库放在模拟器文件资源管理器上的“data/data/(packagename)/database”文件夹中,它可以在模拟器上正常工作. 现在真实设备出现问题。显然它没有要打开的数据库。我试图将数据库放在资产文件夹中,但我没有用 openhelper 打开它。

4

5 回答 5

6

您应该将 .db 文件从资产文件夹复制到内部/外部存储。您可以使用以下代码,

private static String DB_PATH = "/data/data/your package/database/";  
private static String DB_NAME ="final.db";// Database name 

要创建数据库,

public void createDataBase() throws IOException 
{ 
  //If database not exists copy it from the assets 

   boolean mDataBaseExist = checkDataBase(); 
   if(!mDataBaseExist) 
   { 
      try  
      { 
        //Copy the database from assests 
        copyDataBase(); 
        Log.e(TAG, "createDatabase database created"); 
      }  
      catch (IOException mIOException)  
      { 
         throw new Error("ErrorCopyingDataBase"); 
     } 
  } 
} 

检查数据库是否存在于此处:/data/data/your package/database/DB Name

private boolean checkDataBase() 
{ 
    File dbFile = new File(DB_PATH + DB_NAME); 
    return dbFile.exists(); 
} 

从资产中复制数据库

  private void copyDataBase() throws IOException 
  { 
    InputStream mInput = getApplicationContext().getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream mOutput = new FileOutputStream(outFileName); 
    byte[] mBuffer = new byte[1024]; 
    int mLength; 
    while ((mLength = mInput.read(mBuffer))>0) 
    { 
        mOutput.write(mBuffer, 0, mLength); 
    } 
    mOutput.flush(); 
    mOutput.close(); 
    mInput.close(); 
}

我希望它可以帮助你。

于 2013-06-17T07:42:46.943 回答
3

您不能直接从资产文件夹访问数据库,您需要先将其复制到路径 data/data/(packagename)/database 然后使用它:

 private String DB_PATH = "/data/data/" + "yourpackaename" + "/databases/" + "db.db";

在你的 onCreate()

 is = getAssets().open("db.db");
 write(is);

然后调用的方法:

public void write(InputStream is) {
    try {
        OutputStream out = new FileOutputStream(new File(DB_PATH));
        int read = 0;
        byte[] bytes = new byte[1024];

        while ((read = is.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        is.close();
        out.flush();
        out.close();
        System.err.println(out + "\n");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2013-06-17T07:35:01.627 回答
1

您需要首先使用 java 代码将数据库文件从资产复制到应用程序数据位置。您可以发布一些代码来显示您如何打开或处理数据库吗?

于 2013-06-17T07:13:50.947 回答
0

您不能直接从资产文件夹中打开文件。相反,您需要将资产文件夹的内容复制到内部/外部存储中,然后使用该File路径打开文件。在模拟器中,您可以更轻松地访问应用程序的数据文件夹。但是,在真正的非 root android 设备上,由于安全原因,这是不可能的。

于 2013-06-17T07:12:05.037 回答
0

您是否有一个预先填充的数据库并希望集成到您的应用程序中?如果是,您可以简单地使用我的图书馆

在您的应用安装后首次启动时

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.COPY_TO_SYSTEM);

在随后的发布中

SuperDatabase database=new SuperDatabase(getApplicationContext(),"foods.db", AssetDatabaseMode.READ_FROM_DEVICE);

只需触发 SQL 查询

database.sqlInject("INSERT INTO food VALUES('Banana','Vitamin A');");

以 CSV、JSON、XML 格式获取数组的结果

ArrayList<String> rows=new ArrayList<String>();
rows=database.sqlEjectCSV("SELECT * FROM food;");
for (int i=0;i<rows.size();i++)
{
    //Do stuffs with each row
}

为此,您需要包括我的库。这里的文档:
https ://github.com/sangeethnandakumar/TestTube

于 2017-05-24T00:29:01.160 回答