4

我正在使用 sqllite 3.7.4 开发一个 Android 平板电脑应用程序,该应用程序将执行以下操作:

  1. 从 UI 获取信息

  2. 执行一些逻辑并将相关信息存储到 sqlite 数据库

  3. 存储的信息必须立即或按计划间隔(例如在 xyz 日期的 5:00)通过网络发送

目前,我们开发了一种调度机制(线程),它不断地轮询数据库以获取数据库中插入的新信息。线程获取信息并发送到网络模块。

但是,我觉得这不是正确的方法,因为每次轮询都是开销。有时没有什么可以执行,这不是实时的,因为我们每 5 秒轮询一次

所以

有没有办法在数据库中更新信息后立即向我的网络模块发送触发器?

或者有什么更好的方法来完成这个任务?

提前致谢。

4

4 回答 4

3

这个问题大约是一年前的问题,但我认为这是一个常见问题。这就是我处理数据库更改的方式:

在我的适配器(SQL ADAPTER)中,我显然有更新/删除或将数据插入数据库的方法。像这种方法:

public long addProduct(String code, String name ... String gid, String gdate) {

  ContentValues initialValues = new ContentValues();
  initialValues.put(KEY_CODE, code);
  initialValues.put(KEY_NAME, name);
  ...
  initialValues.put(KEY_CHECK, this.checkfalse);
  initialValues.put(KEY_GID, gid);

---------
    Intent i = new Intent("data_inserted");
    i.putExtra("date", date);

    sendBroadcast(i);
---------

  return mDb.insert(SQLITE_TABLE, null, initialValues);
 }

更改发生后,它将发送广播意图。要获取这个,首先在您的onCreate方法(uploaderClass 或其他)中注册您的广播接收器。这将如下所示:

registerReceiver(Updated, new IntentFilter("data_inserted"));

而这个方法来处理下面的动作!

private final BroadcastReceiver Updated= new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        doSomething(); // Data was inserted upload it 
    }
};

编辑 :

为了只从数据库中获取新项目,我签署了新产品。我有一个“信息”列,其中可以包含“上传”、“更新”或“删除”等字符串。然后我从数据库中获取包含这些特殊字符串的所有项目并上传它们。之后,我将它们设置为 null 或空字符串。随心所欲。希望我解释得不复杂:)

于 2014-06-24T15:41:14.967 回答
0

您可以创建自己的数据库侦听器,只要数据库有更新,它将获取信息并发送到网络。我认为会清除一些实现这个东西的想法。

于 2013-01-04T11:49:25.873 回答
-1

现在我们可以使用 Room 来实现这一点。

database.getInvalidationTracker().addObserver(new InvalidationTracker.Observer(tableToObserve) {
        @Override
        public void onInvalidated(@NonNull Set<String> tables) {

        }
    });

database是 RoomDatabase 的一个实例,它是所有 Room 数据库的基类。所有使用“@Database”(这是使用 Room Libary 的方式)注释的类都必须扩展该类。

在 InvalidationTracker.Observer 的 creator 方法中,你可以传入一个 String 数组(或者以 varargs 的形式)来指示你想观察的表,如果这些表发生任何更新,则调用回调方法 onInvalidated .

一些链接可以参考: https://developer.android.com/reference/android/arch/persistence/room/InvalidationTracker.html#addObserver(android.arch.persistence.room.InvalidationTracker.Observer)

于 2018-12-12T06:54:20.617 回答
-2

希望这会对你有所帮助

 private Handler h;
    // in create time
        h = new Handler();


// call where you want
h.postDelayed(myRunnable2, 1000); // after 1000 millisecond this function call automatically 

// this function 
private Runnable myRunnable2 = new Runnable() {
        public void run() {
                              // do some thing

                h.postDelayed(myRunnable2, 1000);

        }
    };
于 2013-01-04T11:41:28.460 回答