【问题标题】:Android external database in assets folder资产文件夹中的 Android 外部数据库
【发布时间】:2013-06-13 02:03:41
【问题描述】:

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

【问题讨论】:

  • 要么以只读方式打开,要么先从assets复制到私有文件夹中。

标签: android database sqlite android-assets


【解决方案1】:

您是否有预填充的数据库并希望将其集成到您的应用中?如果是,您可以简单地使用我的库

安装后首次启动应用时

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

【讨论】:

    【解决方案2】:

    您应该将 .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(); 
    }
    

    希望对你有帮助。

    【讨论】:

    • 你从来没有提到为什么它不能直接从资产文件夹中工作。你能扩展一下吗?
    • 这是一个非常好的问题,我也想知道当您访问资产文件夹中的文件时为什么需要复制?
    • assets文件夹在编译后才准备好,我们不能修改里面的数据。如果您想从我们的应用程序写入数据库,我们必须先将其复制到内部/外部存储。
    • 我相信你的 DB_PATH 字符串中的文件夹应该有一个复数的“databases”——而不是“database”
    【解决方案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();
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这些看起来像是评论。
      【解决方案5】:

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

      【讨论】:

      • 是的,我也试过了。但我的代码似乎不起作用。可能是因为我想访问多个表
      • 您可以访问任意数量的表,而不会在数据库中引发死锁。这取决于你如何尝试。如果您发布一些代码,那将更容易调试
      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多