我正在使用sqllite 3.7.4开发Android平板电脑应用程序 执行以下操作:
从用户界面获取信息
执行一些逻辑并将相关信息存储到sqlite数据库
存储的信息必须立即发送或按计划发送 通过网络间隔(例如,在xyz日期的5:00)
目前,我们已经开发了一种调度机制(线程),它不断轮询数据库以获取插入数据库的新信息。该线程获取信息并发送到网络模块。
但是,我觉得这不是正确的做法 每次轮询都是一种开销。有时可能无法执行任何事情 这不是实时的,因为我们每隔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。
答案 4 :(得分:-2)
我认为使用加载器是您所需要的:http://developer.android.com/guide/components/loaders.html
您可以使用onLoadFinished方法
将数据发送到您的网络