Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android while循环中的当前日期,带有contentvalues和SQLIte_Android_Sqlite - Fatal编程技术网

Android while循环中的当前日期,带有contentvalues和SQLIte

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

我有一个简单的问题。我试图每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 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;
  }
/*...*/}