将MySQL DB导入android SQLite DB

时间:2011-06-30 10:23:11

标签: android mysql sqlite

您能否告诉我如何将外部SQLite或MySQL DB导入android SQLite,或者如何在Android应用程序中使用外部数据库?

3 个答案:

答案 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的内容感兴趣或想要任何澄清,请发表评论,我会回复您