【发布时间】:2011-06-30 10:23:10
【问题描述】:
您能告诉我如何将外部 SQLite 或 MySQL 数据库导入到 android SQLite 或如何在 android 应用程序中使用外部数据库吗?
【问题讨论】:
您能告诉我如何将外部 SQLite 或 MySQL 数据库导入到 android SQLite 或如何在 android 应用程序中使用外部数据库吗?
【问题讨论】:
请注意,您希望导入的外部 SQLite 数据库使用 INTEGER 数据类型作为主键,而不是 INT 或任何其他 INT 变体。来自不同 SQLite 联盟成员的一些 SQLite 风格对 INTEGER 和 INT 主键的处理方式相同,而(旗舰)SQLite 对它们的处理方式不同。
请参阅此处的第 2.0 节:http://www.sqlite.org/datatypes.html
并在此处查看有关 RowId 和主键的部分:http://www.sqlite.org/lang_createtable.html#rowid
PRIMARY KEY 列只会变成 如果声明了整数主键 类型名称正是“INTEGER”。其他 整数类型名称,如“INT”或 "BIGINT" 或 "SHORT INTEGER" 或 “UNSIGNED INTEGER”导致主 键列表现得像一个普通的 具有整数亲和性的表列和 唯一索引,不是的别名 rowid。 [强调]
编辑:如果您的外部 SQLite 数据库将其整数主键定义为 INT 或任何其他 INT 变体,而不是“INTEGER”,则在从联盟成员的实现附加到数据库文件时可能会得到错误的结果.假设子表中的 FK 值为 110;将整数值视为 rowid 别名的连接将查找父表以获取第 110 个物理行,如果在父表中定义了 PK,则该行可能是也可能不是 PK 值 = 110 的行作为 INT 或 BIGINT 任何其他变体!在 SQLite 中,只有 INTEGER [逐字] PK 被视为 rowid 的别名,但一些实现不遵循该规则并将 all INT 类型视为 rowid 的别名。因此,当从其中一个实现附加到使用旗舰 SQLite 创建的外部 SQLite 数据文件时,必须使用“INTEGER”(逐字)主键,而不是任何其他 INT 类型。
【讨论】:
查看here 以找到一些可以将 MySQL 哑元转换为 SQLite 数据库的转换器工具。然后,您可以像往常一样在您的应用程序中导入数据库。
直接使用MySQL db是不可能的。
【讨论】:
我知道这可能是一种便宜的方式,但我使用了推送消息服务 (MQTT) 来获取我的 mysql 转储文件的副本并将消息推送到手机,在手机中我通过解析器运行它以将行插入到我的本地数据库。 mqtt 消息服务有一个预编译的 .jar 库,您可以在 android 应用程序中轻松使用它。
有多种方法可以在您的 Web 服务器上实现 mqtt(SAM->php,或者我确实编写了一个 c++ 侦听服务来转发消息 [使用名为 mosquitto 的开源 mqtt 库])。解析数据的代码只有几行,因为我在我的 android 服务中收到的消息只是一个字节数组。
例如,我将字节数组转换为字符串,将字符串标记化,然后插入到数据库中:
public void parseMysqlDump(byte[] thisPayload) {
ContentResolver cr = this.getContentResolver();
String mysqlDump = "";
for(int i = 0; i < thisPayload.length; i++) {
mysqlDump += (char) thisPayload[i];
}
String[] mysqlDumpNewLineTokens = mysqlDump.split("\\n");
//The first line is the table headers stuff so start with i=1 to get to the first
//data line
for(int i = 1; i < mysqlDumpNewLineTokens.length; i++) {
String[] mysqlDumpSpaceTokens = mysqlDumpNewLineTokens[i].split("\\s");
String dataTitle = mysqlDumpSpaceTokens[0];
ContentValues cv = new ContentValues();
cv.put(Vehicle_DataMetaData.DATA_VALUE, mysqlDumpSpaceTokens[1]);
cr.insert(Vehicle_DataMetaData.CONTENT_URI, cv);
}
TL;DR:获取 mysql 转储,将其作为字符串发送到手机,将字符串解析到数据库中。
如果您对 mqtt 的东西感兴趣或想要任何澄清,请发表评论,我会回复您
【讨论】: