【问题标题】:shared SQl Lite db between phonegap app and native java app在 phonegap 应用程序和本机 java 应用程序之间共享 SQlite db
【发布时间】:2015-07-22 12:46:18
【问题描述】:

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

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

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 应用程序连接到我预先存在的数据库:

 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. 在 Android 上将 js 应用程序和 Java 应用程序连接到同一个 SQLite 数据库的最佳方法是什么? (例子会很有帮助)

信息:

安卓 5.1, 科尔多瓦 5.0

更新:

我已经在两个应用程序中拥有android:sharedUserId="my.app"

【问题讨论】:

    标签: java android sqlite cordova phonegap-plugins


    【解决方案1】:

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

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

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

      https://github.com/brodysoft/Cordova-SQLitePlugin

      但是,SQLite 是一个单用户数据库。如果你走“复制数据库”的路线,那么你就有丢失数据的风险。如果桌面用户添加数据,iOS用户添加数据,复制文件时会丢失某人的数据。

      您可以实现自己的“同步”算法来识别数据库之间的更改并使它们保持同步。这可能会很痛苦,但这是一种常见的解决方案,也是我推荐的。我已经为桌面/iOS 应用程序这样做了。

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

      【讨论】:

      • 这是我正在使用的插件。
      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多