您能否告诉我如何将外部SQLite或MySQL DB导入android SQLite,或者如何在Android应用程序中使用外部数据库?
答案 0 :(得分:3)
请注意,您要导入的外部SQLite数据库使用INTEGER数据类型作为主键,而不是INT或INT的任何其他变体。来自各种SQLite Consortium成员的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”导致初级 键列表现为普通的 具有整数亲和性的表列 唯一索引,不是的别名 the rowid。 [强调补充]
编辑:如果您的外部SQLite数据库的整数主键定义为INT或INT的任何其他变体,而不是“INTEGER”,则从联盟成员的实现附加到数据库文件时可能会得到错误的结果。假设子表中的FK值为110;将整数值视为rowid的别名的连接将查找父表以获取第110个物理行,如果在父表中定义了PK,则该值可能是也可能不是PK值= 110的行作为INT或BIGINT的任何其他变种!在SQLite中,只有INTEGER [verbatim] PK被视为rowid的别名,但某些实现不遵循该规则,并将所有 INT类型视为rowid的别名。因此,当从其中一个实现附加到使用旗舰SQLite创建的外部SQLite数据文件时,必须使用“INTEGER”(逐字)主键而不是任何其他INT类型。
答案 1 :(得分:1)
查看here以找到一些可以将MySQL哑转换为SQLite数据库的转换器工具。然后,您可以照常在应用程序中导入数据库。
直接使用MySQL数据库是不可能的。
答案 2 :(得分:0)
我知道这可能是一种便宜的方式,但是我使用了推送消息服务(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的内容感兴趣或想要任何澄清,请发表评论,我会回复您