在phonegap应用程序和本机java应用程序之间共享SQl Lite数据库

时间:2015-05-11 20:50:14

标签: java android sqlite cordova phonegap-plugins

我有两个Android应用程序(一个用js编写(使用phonegap)另一个用java编写)。两者都需要访问一个SQLite DB。 Yes it's possible.

在我的js文件中,我使用Cordova-sqlite-storage创建数据并将数据插入db:

var db = window.sqlitePlugin.openDatabase({name: "CAC.db", location: 1});

                                    db = sqlitePlugin.openDatabase({name: "CAC.db", location: 2, createFromLocation: 1});


                                          db.transaction(function(tx) {
                                            tx.executeSql('DROP TABLE IF EXISTS test_table');
                                            tx.executeSql('CREATE TABLE IF NOT EXISTS test_table (id integer primary key, data text, data_num integer)');

                                            // demonstrate PRAGMA:
                                            db.executeSql("pragma table_info (test_table);", [], function(res) {
                                              console.log("PRAGMA res: " + JSON.stringify(res));
                                            });

                                            tx.executeSql("INSERT INTO test_table (data, data_num) VALUES (?,?)", ["MY ID", 100], function(tx, res) {


                                              db.transaction(function(tx) {
                                                  tx.executeSql("select data as dt from test_table;", [], function(tx, res) {
                                                  var id = res.rows.item(0).dt;
                                                  console.log("res.rows.item(0).cnt: " + id);

                                                });
                                              });

                                            }, function(e) {
                                              console.log("ERROR: " + e.message);
                                            });
                                          });

然后我使用this answer尝试将java应用程序连接到我之前存在的db:

 Context sharedContext = null;
                        try {
                            sharedContext = this.createPackageContext("com.my.app", Context.CONTEXT_INCLUDE_CODE);
                            if (sharedContext == null) {
                                return;
                            }
                        } catch (Exception e) {
                            String error = e.getMessage();
                            return;
                        }

                        DbAdapter sharedDBadapter = new PerformerDbAdapter(sharedContext);
                        sharedDBadapter.open();

但是我需要在我的js应用程序中使用此代码:

DBadapter hostDBAdapter = new DbAdapter(getApplicationContext());
performerDBadapter.open();

尝试获取其上下文。 (但显然我不能,因为这段代码^是java)。所以我尝试使用this answer.Context context=this.cordova.getActivity().getApplicationContext();)来获取上下文但是我不知道在哪里添加它,我甚至不确定这段代码是否会起作用。

我的问题是:

  1. 我在应用程序中添加this code的位置?
  2. 我是在正确的道路上吗?
  3. 将js应用程序和Java应用程序连接到Android上的同一SQLite Dtatabase的最佳方法是什么? (例子非常有帮助)
  4. 信息:

    Android 5.1, 科尔多瓦5.0

    更新:

    我在两个应用中都已android:sharedUserId="my.app"

2 个答案:

答案 0 :(得分:1)

1)它取决于你的应用程序,请阅读一些关于android的书,并能够将代码放在你需要的地方。您还可以使用GreenDAO更简单地访问sqlite

3)您可以使用相同的证书签署2个不同的应用程序,这样两个应用程序被识别为“相同的用户ID”并且可以共享私人数据

2)这是一种方式,但一种好​​方法(最好的方法)是在android上的两个app之间公开数据就是使用content provider

我希望这可以帮到你

答案 1 :(得分:0)

两者都使用不同的数据库,在这种情况下我建议使用以下插件:

<强> https://github.com/brodysoft/Cordova-SQLitePlugin

但是, SQLite 是单用户数据库。如果你去&#34;复制数据库&#34;路由,然后你冒着丢失数据的风险。如果桌面用户添加了数据且iOS用户添加了数据,则复制文件时某人的数据将会丢失。

您可以实施自己的&#34;同步&#34;识别数据库之间的变化并使它们保持同步的算法。这可能是一种痛苦,但这是一种常见的解决方案,也是我所推荐的。我已经通过这种方式为桌面/ iOS应用程序做到了这一点。

您可以选择使用数据库服务器,但这需要网络访问才能连接到它。