安卓4.4中SQLite数据库无法运行

4
我正在为我的PhoneGap项目使用SQLite数据库。在我测试的其他操作系统上,除了Android 4.4.0+之外,数据库都得到了填充。
访问数据库的代码如下:
public class MathWhiz extends CordovaActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.init();
        super.loadUrl(Config.getStartUrl());
        SharedPreferences sp = getSharedPreferences("MYPREFS",
                Activity.MODE_PRIVATE);

        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // If no shared prefs exist, e.g. first install, it doesn't matter - the
        // following will return false as a default
        Boolean database_copied = sp.getBoolean("database_copied", false);    
        if (!database_copied) {
            try {
                String pName = this.getClass().getPackage().getName();

                this.copy("Databases.db", "/data/data/" + pName
                        + "/app_database/");
                this.copy("sample.db", "/data/data/" + pName
                        + "/app_database/myFile/");
                SharedPreferences.Editor editor = sp.edit();
                editor.putBoolean("database_copied", true);
                editor.apply();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    void copy(String file, String folder) throws IOException {

        File CheckDirectory;
        CheckDirectory = new File(folder);
        if (!CheckDirectory.exists()) {
            CheckDirectory.mkdir();
        }
        InputStream in = getApplicationContext().getAssets().open(file);
        OutputStream out = new FileOutputStream(folder + file);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0)
            out.write(buf, 0, len);
        in.close();
        out.close();

    }

}

这是我如何使用数据库的方式:

window.openDatabase("sampleDB", "1.0", "sample", 200000);

请问有人能指出我需要做哪些更新才能使其在Android 4.4+上运行吗?谢谢。


我不了解PhoneGap。但在Android中,数据库路径应该是data/data/<packagename>/databases/。你应该将你的数据库复制到这个文件夹中。 - Zohra Khan
@ZohraKhan pName 只表示包名。 - Sumodh Nair
我同意你的观点,我也是这个意思。在我的评论中,我想指出这一行代码:this.copy("sample.db", "/data/data/" + pName + "/app_database/myFile/") - Zohra Khan
@ZohraKhan:是啊,我在想为什么它不起作用。问题在于它没有像在4.4中应该创建表格。 - Sumodh Nair
2个回答

2

试一试...它很好用...

public boolean copyDataBaseFromAssets(Context c) throws IOException {

    if(android.os.Build.VERSION.SDK_INT >= 17)
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/"+ DATABASE_NAME;
        else
            DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"+DATABASE_NAME;

        String pathToDatabaseFileInAssetFolder = DATABASE_NAME;
        String pathToDatabaseFileInSystem = DB_PATH;


this.getReadableDatabase(); 

> 在数据库导入代码中使用的getReadableDatabase函数

        AssetManager assetManager = c.getResources().getAssets();
        InputStream inputStream = null;

        try {

            inputStream = assetManager.open(pathToDatabaseFileInAssetFolder);
        } catch (IOException ex) {

            return false;
        }

        if (inputStream != null) {

            OutputStream outputStream = new FileOutputStream(pathToDatabaseFileInSystem);

            byte[] buffer = new byte[1024];
            int length;

            while ((length = inputStream.read(buffer)) > 0) {

                outputStream.write(buffer, 0, length);
            }

            outputStream.flush();
            outputStream.close();
            inputStream.close();

            Log.d(TAG, "Database is copied");
            return true;
        }

        return false;
    }

0

改变这个

    this.copy("Databases.db", "/data/data/" + pName + "/databases/");
    this.copy("sample.db", "/data/data/" + pName + "/databases/");

它正在复制数据库吗?您可以通过sqlite浏览器或终端进行检查。 - Zohra Khan
数据库复制的值是多少?添加一些日志信息进行调试。还有一件事,只需删除您的数据库;adb shell;cd data/data/<PackageName>/databases/;rm *。 - Zohra Khan
抱歉晚了,我通过添加SQLLite插件本身成功在Android 4.4上运行它。 - Sumodh Nair
@sumodh,您能否详细说明SQLLite插件如何帮助您解决问题。我也遇到了类似的情况。 - frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接