我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

Posted

技术标签:

【中文标题】我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?【英文标题】:Can I download an SQLite db on /sdcard and access it from my Android app? 【发布时间】:2010-11-06 12:17:47 【问题描述】:

我已经发现无法将文件捆绑在 .apk 中并将它们放在 /sdcard 上,目前最好的选择是在首次运行时下载大文件。我遇到了一个教程,说如何将 sqlite db 与 apk 捆绑在一起,然后复制它,以便可以使用 SQLiteDatabase 访问它(从而使所需空间增加一倍,并且根本不使用 /sdcard)。

http://developer.android.com/guide/topics/data/data-storage.html#db 表示所有数据库必须在 /data/data/package_name/databases 中。

真的是这样吗?有没有办法欺骗框架打开位于 /sdcard 分区上的数据库?有没有办法使用另一个 SQLite java 包装器/框架来访问这样的数据库?

如果上面的答案是“否”,我还有什么其他选择?我的数据在关系模型中得到了很好的表示,但是太大了,另外,我希望能够更新它而无需重新安装/升级整个应用程序。

【问题讨论】:

你提到“我遇到了一个教程,说如何将一个 sqlite db 与 apk 捆绑,然后复制它..”。你有这个资源的指针吗? @Ichorus - 我想这可能是他所指的 - reigndesign.com/blog/… 【参考方案1】:

当然可以。文档对此有点矛盾,因为他们还说没有施加任何限制。我认为他们应该说相对路径是到上述位置,并且那里的 dbs 是私有的。这是你想要的代码:

File dbfile = new File("/sdcard/mydb.sqlite" ); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
System.out.println("Its open? "  + db.isOpen());

【讨论】:

那么我们可以从应用程序中的所有活动中访问该数据库文件吗???按照惯例,我无法做到这一点! 谢谢亚当。并且不要忘记在您的 AndroidManifest.xml 中添加此权限: @Ashik:我不明白为什么您不能在其他活动中访问它。我们有很多选择 - 将打开的 SQLiteDatabase db 对象转移到您所需的 Activity 或将您的 db 对象存储在静态引用中。那应该掩盖它。 它不起作用,我必须将数据库复制到 /databases(internal) 文件夹才能使其工作【参考方案2】:

试试这个:

String dir = Environment.getExternalStorageDirectory().getPath()
File dbfile = new File(dir+"/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null);
System.out.println("Its open? "  + db.isOpen());

【讨论】:

【参考方案3】:

只是一个想法:

您可以将您的 database.db 放入 assets 文件夹中。

如果你的database.db文件大于2Mb,系统无法压缩,需要其他选项

您可以重命名您的 database.db,例如 database.jit 或 database.mp3 - 它们未压缩,在第一次运行时您可以将其重命名为 database.db

【讨论】:

【参考方案4】:

看看这个……

storing android application data on SD Card

【讨论】:

【参考方案5】:

我分享下一个代码。声明opcionesMenu Vector<String>

Vector < String > opcionesMenu = new Vector< String >();
// the database is SDCard. I saw  the code to Blackberry (net.rim)
String rutaDB = "/storage/extSdCard/Android/databases/Offshore.db";


    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(rutaDB, null);

    Cursor cursor = db.rawQuery("SELECT Codigo, Nombre FROM Ruta ORDER BY Codigo, Nombre", null);

    if (cursor.moveToFirst())
    
        do
        
            opcionesMenu.add(cursor.getString(0) + " - " + cursor.getString(1));
         while(cursor.moveToNext());
    

    db.close();

【讨论】:

以上是关于我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?的主要内容,如果未能解决你的问题,请参考以下文章

在android中使用http比较服务器上文件的大小和sdcard上的文件大小

尝试在 Windows Server 2003 上下载文件时出现 404 错误

从网址下载SDCard上的视频

将 SQLite 数据库从 sdcard 导入到 android - 没有资产文件夹

在 webview 中加载保存在 sdcard 中的图像

如何在 PDO 中加载 sqlite 扩展?