Android while循环中的当前日期,带有contentvalues和SQLIte
我有一个简单的问题。我试图每1秒将当前日期插入数据库,但当我尝试这样做时,日期总是相同的,我希望有一个当前日期。下一个问题是,当我试图用“停止”按钮关闭数据库时,我遇到了以下异常:Android while循环中的当前日期,带有contentvalues和SQLIte,android,sqlite,Android,Sqlite,我有一个简单的问题。我试图每1秒将当前日期插入数据库,但当我尝试这样做时,日期总是相同的,我希望有一个当前日期。下一个问题是,当我试图用“停止”按钮关闭数据库时,我遇到了以下异常: 01-27 13:57:51.063: E/AndroidRuntime(12964): FATAL EXCEPTION: Thread-144 01-27 13:57:51.063: E/AndroidRuntime(12964): java.lang.IllegalStateException: attempt
01-27 13:57:51.063: E/AndroidRuntime(12964): FATAL EXCEPTION: Thread-144
01-27 13:57:51.063: E/AndroidRuntime(12964): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/pl.pawelfrydrych.flyingball/databases/baza.db
01-27 13:57:51.063: E/AndroidRuntime(12964): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
01-27 13:57:51.063: E/AndroidRuntime(12964): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1437)
01-27 13:57:51.063: E/AndroidRuntime(12964): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
01-27 13:57:51.063: E/AndroidRuntime(12964): at pl.pawelfrydrych.flyingball.MainActivity.insertData(MainActivity.java:146)
01-27 13:57:51.063: E/AndroidRuntime(12964): at pl.pawelfrydrych.flyingball.MainActivity$2.run(MainActivity.java:248)
insertData方法:
public void insertData() throws InterruptedException {
ContentValues values = new ContentValues();
myDBAdapter = new Database(this).open();
while(true) {
Date date = new Date();
long millis = System.currentTimeMillis();
values.put(Database.LEFT_POSITION, xPosition);
values.put(Database.RIGHT_POSITION, yPosition);
values.put(Database.GPS, GPSposition);
values.put(Database.TIME, date.toString());
if(myDBAdapter.db != null) {
myDBAdapter.db.insert("baza", null, values);
Thread.sleep(1000 - millis % 1000);
} else {
Log.d(Database.DB_NAME,"db is null");
}
}
}
main活动onClick方法:
public void onClick(View v) {
switch(v.getId()){
case R.id.bStart:
Thread watek = new Thread(){
public void run(){
try {
Looper.prepare();
insertData();
} catch (InterruptedException e) {
Log.v("Thread", "Problem with inserting insertData method");
e.printStackTrace();
}
}
};
watek.start();
break;
case R.id.bStop:
myDBAdapter.close();
break;
}
}
我认为你可以使用TimerTask以特定的间隔重复某件事。您可以根据需要以1秒的间隔使用scheduleTask()。 作为代码
TimerTask task = new TimerTask() {
public void run() {
}
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, firstTime, period);
如果你不想使用Timertask,你也可以使用1个备选方案。或者可以按照链接进行类似操作
}) 1)尝试使用sqlite语法:
values.put(Database.TIME, "NOW()");
2) 在“停止”按钮上,您应该退出while循环,例如:
制作全球旗帜
boolean stop_posting = false;
在开始按钮上,清除此标志
case R.id.bStart:
stop_posting = false;
/*...*/
在“停止”按钮上,不要关闭数据库,而是设置标志
case R.id.bStop:
stop_posting = true;
break;
在cicle中,检查此标志并在设置时返回
while(true){
if(stop_posting) {
myDBAdapter.close();
return;
}
/*...*/}
value.put(Database.TIME,“NOW()”);不起作用,它在时间列中添加了字符串值“NOW()”而不是date;)好的,然后代替
Thread.sleep(1000-millis%1000)代码>使用线程睡眠(1000)代码>,因为现在当您希望每次迭代睡眠1000毫秒时,您的代码睡眠的毫秒数无法预测
while(true){
if(stop_posting) {
myDBAdapter.close();
return;
}
/*...*/}