资源文件夹中的Android外部数据库

时间:2013-06-17 07:08:44

标签: android database sqlite android-assets

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

5 个答案:

答案 0 :(得分:6)

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

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

我希望它可以帮助你。

答案 1 :(得分:3)

您无法直接从资产文件夹访问数据库,您需要先将其复制到路径数据/数据/(包名)/数据库,然后使用它:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分: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

获取Array的结果
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