操作方法:每当SQLite表更新时,都会向Android应用程序提供通知

时间:2013-01-04 10:53:45

标签: android database triggers android-asynctask android-sqlite

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

  1. 从用户界面获取信息

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

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

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

    但是,我觉得这不是正确的做法 每次轮询都是一种开销。有时可能无法执行任何事情 这不是实时的,因为我们每隔5秒就进行一次轮询

    所以

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

    或者更好的方法来完成这项任务?

    提前致谢。

5 个答案:

答案 0 :(得分: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 
    }
};

编辑:

要从数据库中仅获取新项目,我会签署新产品。我有一个colum" info"它可以包含像"上传","更新"等字符串。或"删除"。然后我从数据库中获取包含这些特殊字符串的所有项目并上传它们。之后我将它们设置为null或空字符串。无论你想要什么。希望我解释它不复杂:)

答案 1 :(得分:0)

每当更新数据库时,您都可以创建自己的数据库侦听器,它将获取信息并发送到网络。我认为将明确实现这一点的一些想法。

答案 2 :(得分:-1)

希望如此,这将有助于你

 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);

        }
    };

答案 3 :(得分:-1)

现在,我们可以使用Room实现此目的。

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

        }
    });

数据库是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)

答案 4 :(得分:-2)

我认为使用加载器是您所需要的:http://developer.android.com/guide/components/loaders.html

您可以使用onLoadFinished方法

将数据发送到您的网络