首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将已有的数据库放入.apk文件?

如何将已有的数据库放入.apk文件?
EN

Stack Overflow用户
提问于 2010-10-26 10:40:20
回答 3查看 15.4K关注 0票数 7

我已经预先构建了大部分字符串对象的数据库。我想知道如何放入我的apk文件,这样当用户安装数据库时,数据库就已经创建好了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-26 10:47:24

我找到了一个很好的例子:Using your own SQLite database in Android applications

基本上,您将创建的数据库导出为sql文件,并将其存储在assets文件夹中。在第一个程序启动时,将文件的数据导入到最终的数据库中。

我认为这是最好的方法,但是你的数据会在apk和db中存在两次,使用更多的存储空间。

票数 11
EN

Stack Overflow用户

发布于 2012-05-11 20:16:50

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'...
  }
}

您将得到一个标准的SQLiteDatabase对象,唯一的限制是它不支持写入。(显然!)

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

.获取代码

注意:我刚刚写完这篇文章,到目前为止只做了非常基本的测试。错误报告将不胜感激!

票数 8
EN

Stack Overflow用户

发布于 2014-05-08 16:05:18

没有任何简单的方法可以直接从资产中读取数据库。您应该在第一次运行时将数据库从assets复制到data文件夹,然后在每次启动应用程序时,您应该检查data文件夹中的数据库,如果数据库不存在,则再次复制它。

这些步骤可以帮助您:

1)在您的数据库上执行这些命令,如果您的数据库中没有android_metadata表,则android无法打开您的数据库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE android_metadata(locale TEXT DEFAULT 'en_US')
INSERT INTO android_metadata VALUES('en_US')

2)分块您的数据库,因为android不支持从资产中读取超过1MB的文件。

这段python代码将数据库分成块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def chunk_file(file_name):
    input_file = open(file_name, "rb")

    chunk_counter = 0;
    while True:
        chunk = input_file.read(512 * 1024) # 512 KB
        if chunk:
            output_file_name = file_name + "." + str(chunk_counter).zfill(4)

            output_file = open(output_file_name, "wb")
            output_file.write(chunk)
            output_file.close()

            chunk_counter += 1
        else:
            break

    input_file.close()
    return

# Input: database.db
# Output: database.db.0000, database.db.0001, database.db.0002, ...
chunk_file("database.db")

然后放入database.db.0000,database.db.0001,database.db.0002,...在assets文件夹中。

3) app启动时,检查data文件夹中是否存在数据库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static boolean databaseExists() {

    boolean result = false;

    SQLiteDatabase checkDB = null;

    try {
        checkDB = SQLiteDatabase.openDatabase(
                getApplicationContext().getFilesDir().getPath() + "/database.db",
                null, SQLiteDatabase.OPEN_READONLY);
        result = true;
    } catch (SQLiteException exception) {
        result = false;
    }

    if (checkDB != null) {

        checkDB.close();

    }

    return result;
}

4)如果数据文件夹中不存在数据库,则将数据库从资产复制到数据文件夹。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void copyDatabase() throws IOException {
    AssetManager assets = getApplicationContext().getAssets();

    // database.db.0000, database.db.0001, database.db.0002, ... --> databaseChunks.
    String[] databaseChunks = assets.list("");
    Arrays.sort(databaseChunks);

    OutputStream databaseStream = new FileOutputStream(
            getApplicationContext().getFilesDir().getPath() + "/database.db");

    for (int i = 0; i < databaseChunks.length; i++) {
        String databaseChunkName = databaseChunks[i];

        InputStream chunkStream = assets.open(databaseChunkName);

        int length;
        byte[] buffer = new byte[1024];
        while ((length = chunkStream.read(buffer)) > 0) {
            databaseStream.write(buffer, 0, length);
        }

        chunkStream.close();
    }

    databaseStream.close();

    return;
}

5)现在可以连接数据库了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQLiteDatabase database = SQLiteDatabase.openDatabase(
            getApplicationContext().getFilesDir().getPath() + "/database.db",
            null, SQLiteDatabase.OPEN_READONLY);
// ...
database.close();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4022866

复制
相关文章
Flux如何将Git放入GitOps
自从 Flux 获重写为一组聚焦的控制器以来,它的每个功能和能力变得更加清晰。适当命名的控制器以它们的名字携带它们所负责的内容,以及它们与哪些数据或工具交互,例 source、kustomize、image-automation、notification、helm,等等。
CNCF
2022/04/19
1.2K0
Flux如何将Git放入GitOps
git 如何删除已经 add 的文件 (如何撤销已放入缓存区文件的修改)
修改或新增的文件通过 git add --all命令全部加入缓存区(index区)之后,使用 git status 查看状态
一个会写诗的程序员
2021/07/13
11.8K1
PhalApi-APK--APK文件解包处理
#PhalApi-APK -- APK文件解包处理 ##前言 应为笔者这边涉及到的项目有需求对APK进行解包的操作,所以贡献此扩展希望大家喜欢 附上: 官网地址:http://www.phalapi.
喵了个咪233
2018/03/02
1.9K0
PhalApi-APK--APK文件解包处理
Android之共享已安装的apk应用
          是否遇到过自己手机上有好的应用,但不知道怎么分享给好友的时候呢?作为一名程序员,遇到了这样简单的问题,肯定要想办法解决,经过google和百度,查得android上所有已安装的应用都会做一个备份,分别存放在三个地方: 1、系统签名的软件:/system/app 2、安装到内存上的非系统签名软件:/data/app 3、安装到sd卡上的非系统签名软件:/mnt/asec/包名-数字/pkg.apk 我们可以使用re浏览器查看和分享这些apk,本人已确认过,这些应用都是可用的,但是
forrestlin
2018/05/23
3.4K0
【连载】聊聊 APK(四) —— 脱离 AS 手工创造 APK 文件
想进大厂,就关注「 程序亦非猿 」 时不时 8:38 推送优质文章,觉得有用,置顶加星标
程序亦非猿
2019/08/21
1.8K0
【连载】聊聊 APK(四) —— 脱离 AS 手工创造 APK 文件
将现有的Apk打包到AOSP的编译结果中
在pakcages/apps下创建子目录 将apk放置在此子目录,创建Android.mk 将如下内容写入Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := 'youAppName' LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAG
用户2930595
2018/08/23
1.4K0
如何将没有复制或移动构造函数的对象放入vector容器
直接说答案,这个问题无法实现。原因是因为std::vector容器的插入一定会调用类对象的构造函数或者移动构造函数。
charlee44
2023/10/22
2030
将SIP Trace放入日志文件(mod_logfile)
今天,看大家在QQ群中聊到不知道如何在FreeSWITCH中将SIP Trace的结果放入日志文件中。我便答应大家我今晚研究一下。 事情的起因是这样的。FreeSWITCH内置了SIP Trace,可以很方便的在控制台或fs_cli中抓到SIP消息,配合日志调试起来非常方便。以前我应该也讲过,在FreeSWITCH中开启SIP Trace的命令是: sofia global sip trace on 当然,也可以单独针对某个Profile开启或关闭日志,如: sofia profile internal siptrace on sofia profile internal siptrace off 问题时,开启日志后SIP消息只能在控制台上显示,但不会同时进入日志文件中,显然,如果想从日志文件中同时看到SIP就比较麻烦了。因而,便出现了今天的主题:如何将SIP Trace放入日志? 首先,我想,提到该问题的人可能一般的是Windows用户吧。因为一般来说,我在Mac上(或Linux)上,Shell足够好用,因而,可以毫不费力的在Shell窗口(即FreeSWITCH控制台上)中将带有SIP消息的日志一块Copy出来粘贴到其它文件中。但在Windows上就没有那么方便了,因为Windows的命令行窗口出奇的烂,从里面Copy个文字特别麻烦。而且,有很多人根本不知道如何Copy(虽然确实有办法可以做到)。因而,常见的做法是直接用QQ抓屏,但很显然,抓屏是有限制的,那就是,一屏能显示的信息实在是太短了,如果要抓到SIP消息,那简直是个累死人的活。 而且,在此我也想插一句,我在帮人看日志时是非常讨厌抓屏的。因为看起来其实不直观,而且,没法搜索,没法Copy,没法引用…,总之,不爽。可能光说不爽有人觉得我矫情,那就说一下为什么不爽吧。比如有人在QQ群中问了个问题,我问他打的是什么命令,它将他打的命令抓了个图片发到QQ群中,我一眼就发现他的命令该怎么改成正确的方式,只要我将它的命令复制一遍,改几个字即可,但是,由于他是抓屏,因此我没法修改... 言归正传,所以,特别是Windows用户,一般是到日志文件中去找到相应的日志再复制出来,并且,有时候他们也希望SIP Trace出来的消息也同时在日志文件里面。 当然,既然我答应大家研究,就一定要出结果的(为什么要研究呢?因为我一直不用,所以没试过)。通过研究我发现,写日志文件的功能是在mod_logfile中实现的。里面有这么一行配置: <map name="all" value="debug,info,notice,warning,err,crit,alert"/> 到这里科普一下。在FreeSWITCH中,日志是有级别的,一般来说就是上面列的一些级别。当然,上面没有包括一个特殊的级别,那就是 console 级别。而SIP Trace的消息正是在 console 级别的,因而,它只有控制台上显示,而不会在日志文件中显示。明白了这个道理,想办法将console级别的日志放入日志文件就简单了,修改配置如下: <map name="all" value="console,debug,info,notice,warning,err,crit,alert"/> 然后,重新加载模块即可: reload mod_logfile 再看SIP Trace的结果,都写到日志文件中去了,Bingo! 当然,任何事情并不只有一种办法,第二种办法是什么呢?留点引子,明天再讲。 既然今天说到mod_logfile,就索性把这一模块也讲了吧。其实,有了上面的,也没什么好讲的。mod_logfile的作用就是将系统日志写到日志文件中去,并有相应的参数配置文件的路径以及文件的最大长度。如果文件写到一定的大小,则会自动发生轮转(rotate),以防止在长期运行过程中产生巨大无比的日志文件。 ---------------------------------------- 题图:Log 来自 Google Log本来是「圆木」的意思,但我们这些程序员们都将Log译为「日志」。 ---------------------------------------- FreeSWITCH-CN是什么? FreeSWITCH-CN是FreeSWITCH中文社区,我们的官方网站是 http://www.freeswitch.org.cn 。FreeSWITCH-CN同时也是一个微信公共账号,可以通过点击本页最顶端的“FreeSWITCH中文社... ”,或在通迅录->订阅号中搜索“FreeSWITCH-CN”来订阅,也可以到官方网站上扫描二维码。当然,不管是新用户还是老用户,随时都可以输入m或1显示本账号的主菜单。 FreeSWITCH-
杜金房
2020/12/21
2.1K0
名称乱码的文件不要放入nfs协议的cfs
这样一个奇怪名称的文件,从windows客户端拷贝到nfs协议的cfs后,重新挂载cfs后,发现文件名里那些奇怪的字符变成了问号,无法删除、移动、拷贝、重命名
Windows技术交流
2022/01/12
1.1K0
【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )
ApkTool.py 是一个 APK 文件处理脚本 , 主要针对 APK 文件进行各种处理 , 如文件分析 ;
韩曙亮
2023/03/29
1.6K0
【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 )
破解APK修改资源文件
本文,乃是反编译(逆向)首战,在此,特意记录过程中遇到的点点滴滴问题,如有不足之处,欢迎指正~
贺biubiu
2019/06/11
9.8K3
如何手动给APK文件签名
版权声明:转载注明出处 https://blog.csdn.net/weixin_42514606/article/details/89518401
叉叉敌
2019/05/10
1.4K0
如何手动给APK文件签名
如何手动给APK文件签名
由于您的应用签名密钥用于验证您作为开发者的身份,并确保为您的用户进行无缝而安全的更新,因此,管理和保护您的密钥对于您和您的用户而言都非常重要。 您可以选择使用 Google Play 的 App Signing 以利用 Google 的基础架构安全地管理和存储您的应用签名密钥,也可以选择自行管理和保护您的密钥库和应用签名密钥。 Android 要求所有 APK 必须先使用证书进行数字签署,然后才能安装。 此外,您需要先签署您的 Android App Bundle,才能将其上传到 Play 管理中心。
叉叉敌
2019/04/29
4.1K0
使用jks文件为apk签名
原来apk是使用jks格式的签名文件来操作的,还有一种是keystore文件格式。我们先来看jks文件格式怎么操作
全栈程序员站长
2022/06/29
1.2K0
【Android 逆向】APK 文件格式 ( Android 应用安装 | Zip 文件格式 | 使用 Python 代码提取 APK 文件 )
APK 是 Android 应用的安装文件 , 现在也有 AAB 格式的 , AAB 安装包也可以导出 APK 安装文件 ;
韩曙亮
2023/03/29
1.3K0
【Android 逆向】APK 文件格式 ( Android 应用安装 | Zip 文件格式 | 使用 Python 代码提取 APK 文件 )
Java数组放入集合优化
这个代码这样写是没有问题的,但是语句却很长,不易于阅读,网上查阅资料后发现这样一段话
Erwin
2019/12/31
6330
遍历取出指定文件夹下所有的文件
rootdir='D:\\icon集合\\icon集合' def listAllFiles(rootPath): list=os.listdir(rootPath) for i in range(0,len(list)): path=os.path.join(rootPath,list[i]) if os.path.isfile(path): print(path) elif os.path.isdir(path):
hbbliyong
2018/08/01
1.2K0
SystemUI.apk等特殊APK文件的反编译和编译技巧[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 SystemUI.apk等特殊APK文件的反编译和编译技巧
全栈程序员站长
2022/10/02
1K0
apk文件的sign以及align命令
对于android应用来说,发布release版本的时候,需要有个正式的签名,这个时候就需要用到jarsigner命令了。
code4it
2018/09/17
1.8K0
点击加载更多

相似问题

如何将java属性文件放入apk?

26

如何将墙纸放入apk文件中?

10

如何将资源放入ready .apk?

13

如何将现有的sqlite数据库附加到.apk项目?

21

Gradle将重复文件放入apk文件中

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文