在数据库中记录

时间:2013-11-28 19:40:03

标签: android database parse-platform

试用网站parse.com将数据加载到数据库中

@Override
  public void onClick(View v) {


    cv = new ContentValues();


    db = dbHelper.getWritableDatabase();        

    switch (v.getId()) {

    case R.id.btnAdd:

            query = new ParseQuery("mens");
               query.setLimit(50);             
                query.findInBackground(new FindCallback() {
                public void done(List<ParseObject> mens, ParseException e) {
                  if (e == null) {
                        for ( int i = 0; i < 50; i++) {    

                             stGet = mens.get(i).getString("Str");                                 
                             cv.put("email", stGet);

                             long rowID = db.insert("mytable", null, cv);

                            }                
                     } 
                  }
                 });             

      break;

    dbHelper.close();
}

类DBHelper扩展了SQLiteOpenHelper {

    public DBHelper(Context context) {
          super(context, "myDB", null, 1);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

      db.execSQL("create table mytable ("
          + "id integer primary key autoincrement,"
          + "email text" + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }

在模拟器上获取

  

java.lang.IllegalStateException:尝试重新打开已经关闭的   对象:SQLiteDatabase:/data/data/com.project.test/databases/myDB at   android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)   在   android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:   1437)在   android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)   在com.project.test.MainActivity $ 1.done(MainActivity.java:347)at   com.parse.FindCallback.internalDone(FindCallback.java:48)at   com.parse.FindCallback.internalDone(FindCallback.java:33)at   com.parse.BackgroundTask.onPostExecute(BackgroundTask.java:50)at   com.parse.BackgroundTask.onPostExecute(BackgroundTask.java:16)at   android.os.AsyncTask.finish(AsyncTask.java:631)at   android.os.AsyncTask.access $ 600(AsyncTask.java:177)at   android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)   在android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:137)at   android.app.ActivityThread.main(ActivityThread.java:5103)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:525)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)at   dalvik.system.NativeStart.main(原生方法)

在真实设备上

  

FATAL EXCEPTION:主java.lang.IllegalStateException:数据库不是   打开   android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:   1671)在   android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1571)   在com.project.test.MainActivity $ 1.done(MainActivity.java:347)at   com.parse.FindCallback.internalDone(FindCallback.java:48)at   com.parse.FindCallback.internalDone(FindCallback.java:33)at   com.parse.BackgroundTask.onPostExecute(BackgroundTask.java:50)at   com.parse.BackgroundTask.onPostExecute(BackgroundTask.java:16)at   android.os.AsyncTask.finish(AsyncTask.java:417)at   android.os.AsyncTask.access $ 300(AsyncTask.java:127)at   android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:429)   在android.os.Handler.dispatchMessage(Handler.java:99)at   android.os.Looper.loop(Looper.java:130)at   android.app.ActivityThread.main(ActivityThread.java:3687)at   java.lang.reflect.Method.invokeNative(Native Method)at   java.lang.reflect.Method.invoke(Method.java:507)at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)at   dalvik.system.NativeStart.main(原生方法)

long rowID = db.insert(“mytable”,null,cv); // MainActivity.java:347

有什么问题?

2 个答案:

答案 0 :(得分:1)

我认为您在使用之前错过了打开DataBase,或者您试图在没有DataBase的情况下再次打开关闭open

答案 1 :(得分:0)

尝试不删除此行来关闭数据库:

dbHelper.close();

如上所述in this post,您不必在SQLite中关闭数据库。 实际上,我认为你不应该关闭。

在我的情况下,我只使用DatabaseHelper的单个实例,它工作正常,即使有多个线程访问数据库。当应用程序退出时,操作系统将关闭数据库连接。

只需提醒关闭游标即可。

以下是另一个可能有用的参考资料:What are the best practices for SQLite on Android?