是否有可能获得apk中对sqlite数据库的只读访问权限?

gon*_*ins 7 sqlite android

可能重复:
如何将现有数据库放在.apk文件中?

是否有可能获得对位于apk的sqlite数据库的只读访问权限?如果可以从apk中以只读方式访问数据库,我不想复制数据库.

kiw*_*rew 11

我刚刚开始为Android开发,并且惊讶地发现捆绑静态数据库并不容易.所以我做了唯一合理的事情:创建了一个可以做到这一点的库.

android-staticdb是一个Android库,允许对应用程序.apk文件中包含的SQLite数据库进行只读访问.这对于需要附带大量静态数据的应用程序(例如离线维基百科阅读器)非常理想.

它的工作原理是使用来自本机C代码的SQLite库注册一个新的"虚拟文件系统"层,它能够拦截SQLite发出的文件系统调用.因为每个VM进程只有一个SQLite库副本,所以我们实际上最终会拦截任何应用程序在与我们相同的进程中进行的任何 SQLite调用!

在正常操作中,我们的VFS层只是代理对"默认"VFS的所有调用,它只使用open()和read()来访问常规数据库文件.但是当*.apk!filename遇到匹配模式的特殊文件名时,我们的VFS会抓取控制权.使用zlib和minizip,它打开.apk文件并查找数据库文件; 然后它将读取此文件的块以满足read()来自SQLite的任何请求.

通过这种方式,应用程序可以继续使用标准的Android数据库API.

用法示例:

import android.database.sqlite.SQLiteDatabase;
import kiwidrew.staticdb.StaticDatabase;

public class BlahBlah extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    SQLiteDatabase db = StaticDatabase.openDatabase(this, "assets/foobar.db");
    // Do normal database stuff with 'db'...
  }
}
Run Code Online (Sandbox Code Playgroud)

你得到一个标准的SQLiteDatabase对象,唯一的限制是它不支持写入.(明显!)

请注意,除非数据库存储在.apk没有压缩的情况下,否则这将失败.使用aapt -0命令添加SQLite数据库或修改您build.xml<nocompress extension="db" />标志以将标志传递给<aapt>标记...

注意:

我刚刚写完这篇文章,到目前为止只进行了非常基本的测试.Bug报告将不胜感激.


tpo*_*pow 1

不可以,apk 必须有一个接口供您提取数据 - 可以通过 Android 服务公开该数据。

据我所知,Android 是一个 Linux 发行版,其中每个 .apk 都是由一个单独的用户帐户安装的,没有一个是 root 帐户。因此,应用空间被有效地划分。