2

我正在尝试'Offline Dictionary Android App使用 Cordova 创建。我已经使用SQLite database browser. 数据库文件是test.db,它有一个表,其中test包含两个字段“_id”INTEGER PRIMARY KEY和“值” TEXT。还插入了一些记录。

我试过这些没有运气:

  1. 导入/导出到 android sqlite 数据库
  2. 无法在 Android 中使用 PhoneGap/Cordova 访问预填充的 SQLite 数据库


我已经能够收集到以下代码。我希望我的第三次尝试能够成功,所以我在这里寻求专家的帮助。

我做了什么

我将test.dbsqlite数据库文件放在assets我的android项目的目录中。我有MainActivity.java文件,其中包含以下代码:

MainActivity.java

package com.example.sqlite;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Bundle;
import android.util.Log;

import org.apache.cordova.*;

public class MainActivity extends DroidGap {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");

        try{
            System.out.println("----------Copying Database -----------");
                copyDataBase("test.db");

        } catch (IOException ioe){
            System.out.println("----------Error Copying Database -----------");
            ioe.printStackTrace();

        }


    }

    private void copyDataBase(String dbname) throws IOException {
        // Open your local db as the input stream
        String pkg = this.getApplicationContext().getPackageName();
        InputStream myInput = this.getAssets().open(dbname);

        // Path to the just created empty db
        String outFileName = "/data/data/"+ pkg + "/databases/" + dbname;

        // Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);


        // transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        // Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

}

script.js使用以下脚本归档:

脚本.js

(function($, undefined){

    document.addEventListener('deviceready', onDeviceReady, false);

    function onDeviceReady(){

        var db = window.openDatabase(
            'test.db',
            '1.0.0',
            'Test Database',
            64 * 1024
        );

        db.transaction(function(tx){

            tx.executeSql(
                'SELECT * FROM test', [], function(tx, result){

                    console.log("Query Success");
                    console.log('Total Rows :' + result.rows.length);

                },function(tx, error) {
                    console.log('An Error Occured (Qry) : ' + error.message);
                }
            )

        }, function(error){

            console.log('An Error Occured : ' + error.message);

        }, function(){
            console.log("Transaction Success");
        })

    }

})(jQuery);

我已经在两者中启动了我的应用程序,emulatorphysical device得到了相同的错误响应,即“没有这样的表:测试”。我找到了test.dbinsdie data/data/MY_PACKAGE/databases/。我pulled使用eclipse打开了那个数据库文件,SQLite Database browser并且有一个test表格,里面有一些我已经填充的记录。

我正在使用 cordova 2.6.0 并在 android 4.2 上测试我的应用程序。我的设备没有植根(如果不影响则忽略)。

可视化场景的屏幕截图: 在此处输入图像描述

为什么即使有一张桌子我也会收到“没有这样的桌子”错误?

请帮忙。

4

2 回答 2

1

只需检查您是否已正确完成数据库中的连接,然后创建一个表,插入一些数据,然后从 Cordova 和数据库浏览器中选择您在表中放置的内容。

也许你不需要放.db,先试试这段代码

var db = window.openDatabase(
        'test',
        '1.0.0',
        'Test Database',
        64 * 1024
    );

db.transaction(function populateDB(tx) {

    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');

},function errorCB(tx, err) {

    alert("Error processing SQL: "+err);

},function successCB() {

    alert("success!");

});
于 2013-09-16T17:07:42.780 回答
0

我完全测试了你的代码。我解决了用js代码编写完整路径:

var db = window.openDatabase(
        '/data/data/com.example.myapp/databases/test.db',
        '1.0.0',
        'Test Database',
        64 * 1024
    );

..在重新运行项目之前清理项目。

希望这对您有所帮助。

问候

于 2013-10-11T17:27:10.253 回答