2013-03-13 3 views
3

Я пытаюсь вставить значения в базу данных для приложения Android SQLite. Я пишу следующий код:Android SQLite ContentValues ​​не вставляет

public class DataBaseAdapter extends SQLiteOpenHelper 
{ 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "AlarmSystem"; 

// Alarm table name 
private static final String TABLE_NAME = "Alarms"; 

//AlarmTable Columns names 
private static final String KEY_ALARM_ID = "Id"; 
private static final String KEY_DESC = "Description"; 
private static final String KEY_REPEAT_DAY = "RepeatDay"; 
private static final String KEY_REPEAT_TYPE = "REPEAT_TYPE"; 
private static final String KEY_CALENDAR = "Calendar"; 
private static final String KEY_APP = "Device"; 
private static final String KEY_ACTIVE = "Active"; 

//creating database 
public DataBaseAdapter(Context con) 
{ 
    super(con, DATABASE_NAME, null, DATABASE_VERSION); 
} 

//creating table 
@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    String CREATE_TABLE = "Create Table "+TABLE_NAME+"(" 
      +KEY_ALARM_ID+" integer primary key AUTOINCREMENT, "+KEY_DESC+" TEXT, "+KEY_REPEAT_DAY+ " TEXT," 
      +KEY_REPEAT_TYPE+" integer, "+KEY_CALENDAR+" TEXT, "+KEY_APP+" TEXT, "+KEY_ACTIVE+" integer);"; 

    db.execSQL(CREATE_TABLE); 
} 
//updating database 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
{ 
    // Drop older table if existed 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 

    // Create tables again 
    onCreate(db); 
} 
public void addAlarm(Alarm alarm) 
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 

    values.put(KEY_DESC, alarm.getDesc()); 
    values.put(KEY_REPEAT_DAY, alarm.getRepeatDay()); 
    values.put(KEY_REPEAT_TYPE, alarm.getRepeatType()); 
    values.put(KEY_CALENDAR, Long.toString(alarm.getCalendarInMillis())); 
    values.put(KEY_APP, alarm.getApp()); 
    values.put(KEY_ACTIVE, alarm.getActive()); 

    db.insert(TABLE_NAME, null, values); 
    db.close(); 
} 

Я не знаю, что это проблема. Поэтому я проводка LogCat:

03-13 17:09:33.388: D/SqliteDatabaseCpp(1095): Registering sqlite logging func: /data/data/com.example.devicecontrolpanel/databases/AlarmSystem 
    03-13 17:09:33.408: D/SqliteDatabaseCpp(1095): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, cannot stat file, errno = 2, message = No such file or directory 
    03-13 17:09:33.408: D/SqliteDatabaseCpp(1095): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x8ccc98, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M 
    03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x8ccc98, type = w, r/w = (0, 0) 
    03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, file size = 4096 
    03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x8f3100, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M 
    03-13 17:09:33.588: D/SqliteDatabaseCpp(1095): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x8f3100, type = w, r/w = (0, 0) 
    03-13 17:09:33.598: D/AndroidRuntime(1095): Shutting down VM 
    03-13 17:09:33.598: W/dalvikvm(1095): threadid=1: thread exiting with uncaught exception (group=0x40ae0228) 
    03-13 17:09:33.618: E/AndroidRuntime(1095): FATAL EXCEPTION: main 
    03-13 17:09:33.618: E/AndroidRuntime(1095): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.devicecontrolpanel/com.example.devicecontrolpanel.Main}: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread.access$600(ActivityThread.java:139) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.os.Looper.loop(Looper.java:156) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread.main(ActivityThread.java:4987) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at java.lang.reflect.Method.invokeNative(Native Method) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at java.lang.reflect.Method.invoke(Method.java:511) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at dalvik.system.NativeStart.main(Native Method) 
    03-13 17:09:33.618: E/AndroidRuntime(1095): Caused by: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:448) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:435) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:176) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:168) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:190) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:117) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at com.example.devicecontrolpanel.Main.onCreate(Main.java:19) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.Activity.performCreate(Activity.java:4538) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161) 
    03-13 17:09:33.618: E/AndroidRuntime(1095):  ... 11 more 
    03-13 17:16:48.144: D/SqliteDatabaseCpp(2080): Registering sqlite logging func: /data/data/com.example.devicecontrolpanel/databases/AlarmSystem 
    03-13 17:16:48.144: D/SqliteDatabaseCpp(2080): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, cannot stat file, errno = 2, message = No such file or directory 
    03-13 17:16:48.164: D/SqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x86b220, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M 
    03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x86b220, type = w, r/w = (0, 0) 
    03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: open db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, flag = 6, file size = 5120 
    03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle: 0x897800, type: w, r/w: (0,1), mode: truncate, disk free size: 777 M 
    03-13 17:16:48.384: D/SqliteDatabaseCpp(2080): DB info: close db, path = /data/data/com.example.devicecontrolpanel/databases , key = 9lYvmWqw, handle = 0x897800, type = w, r/w = (0, 0) 
    03-13 17:16:48.394: D/AndroidRuntime(2080): Shutting down VM 
    03-13 17:16:48.414: W/dalvikvm(2080): threadid=1: thread exiting with uncaught exception (group=0x40ae0228) 
    03-13 17:16:48.424: E/AndroidRuntime(2080): FATAL EXCEPTION: main 
    03-13 17:16:48.424: E/AndroidRuntime(2080): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.devicecontrolpanel/com.example.devicecontrolpanel.Main}: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2205) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2240) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread.access$600(ActivityThread.java:139) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.os.Looper.loop(Looper.java:156) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread.main(ActivityThread.java:4987) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at java.lang.reflect.Method.invokeNative(Native Method) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at java.lang.reflect.Method.invoke(Method.java:511) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at dalvik.system.NativeStart.main(Native Method) 
    03-13 17:16:48.424: E/AndroidRuntime(2080): Caused by: java.lang.IllegalStateException: database /data/data/com.example.devicecontrolpanel/databases/AlarmSystem (conn# 0) already closed 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2194) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:448) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:435) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:79) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:176) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:168) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at com.example.devicecontrolpanel.DataBaseAdapter.getAlarmsCount(DataBaseAdapter.java:196) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at com.example.devicecontrolpanel.DataBaseAdapter.getAllAlarmList(DataBaseAdapter.java:123) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at com.example.devicecontrolpanel.Main.onCreate(Main.java:19) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.Activity.performCreate(Activity.java:4538) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2161) 
    03-13 17:16:48.424: E/AndroidRuntime(2080):  ... 11 more 
+0

активность .. ?? может U, пожалуйста, помогите мне. –

+0

Отправьте вызывающую деятельность, пожалуйста. У вашего db нет открытого соединения, вот что говорит вам исполнитель. – staaar

+0

[здесь] (http://stackoverflow.com/questions/15385059/sqlite-exception-database-already-closed?noredirect1_comment21744528_15385059) является вызывающей деятельностью в этом вопросе. –

ответ

3

В общем, лучше отделить (в вашем случае addAlarm, editAlarm, deleteAlarm) в отдельном классе. Я предлагаю вам создать новый класс с именем myAppDataSource и добавить все методы-обертки в этот класс, чтобы сделать вашу жизнь проще.

Код для этого класса будет выглядеть следующим образом:

public class StudyManagerDataSource { 

    SQLiteOpenHelper dbHelper; 
    SQLiteDatabase database; 

public StudyManagerDataSource(Context context) { 
      dbHelper = new DatabaseAdapter(context); 

     } 

public void addAlarm(Alarm alarm) 
{ 

    // open the database connection 
    open(); 
    ContentValues values = new ContentValues(); 

    values.put(KEY_DESC, alarm.getDesc()); 
    values.put(KEY_REPEAT_DAY, alarm.getRepeatDay()); 
    values.put(KEY_REPEAT_TYPE, alarm.getRepeatType()); 
    values.put(KEY_CALENDAR, Long.toString(alarm.getCalendarInMillis())); 
    values.put(KEY_APP, alarm.getApp()); 
    values.put(KEY_ACTIVE, alarm.getActive()); 
    database.insert(TABLE_NAME, null, values); 
    // I will suggest to keep the connection to the database open when your app is 
    // running, the recommended time to close the connection is when your app is 
    //going to pause/stop. 
    close(); 
} 

public void open() { 
     database = dbHelper.getWritableDatabase(); 
     Log.i(LOG_TAG, "Database Opened"); 
    } // end method open 

public void close() { 
     Log.i(LOG_TAG, "Database Closed"); 
     dbHelper.close(); 
    } // end method close 
} 
+0

ContentProviders могут значительно облегчить жизнь при работе с SQLite. –

1

Вы должны открыть соединение с базой данных первым, попробуйте поместить db.open() в onCreateMethod()

//creating table 
@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.open(); 
    String CREATE_TABLE = "Create Table "+TABLE_NAME+"(" 
      +KEY_ALARM_ID+" integer primary key AUTOINCREMENT, "+KEY_DESC+" TEXT, "+KEY_REPEAT_DAY+ " TEXT," 
      +KEY_REPEAT_TYPE+" integer, "+KEY_CALENDAR+" TEXT, "+KEY_APP+" TEXT, "+KEY_ACTIVE+" integer);"; 

    db.execSQL(CREATE_TABLE); 
} 
+0

'db.open' не является определенным методом. –

+0

Попробуйте отделить свои функции от разных классов. Класс SQLite Open Helper должен содержать только методы onCreate() и onUpdate(). Поэтому вы должны написать другой класс, например, класс Alarm. Затем вы можете создать соединение с базой данных и добавить метод addAlarm() в этом классе. –

+0

db.open - не лучший способ открыть базу данных. – 2016-08-05 06:39:02

0
public void addAlarm(Alarm alarm) 
{ 

    // open the database connection 
    database=this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 

    values.put(KEY_DESC, alarm.getDesc()); 
    values.put(KEY_REPEAT_DAY, alarm.getRepeatDay()); 
    values.put(KEY_REPEAT_TYPE, alarm.getRepeatType()); 
    values.put(KEY_CALENDAR, Long.toString(alarm.getCalendarInMillis())); 
    values.put(KEY_APP, alarm.getApp()); 
    values.put(KEY_ACTIVE, alarm.getActive()); 
    database.insert(TABLE_NAME, null, values); 
    // I will suggest to keep the connection to the database open when your app is 
    // running, the recommended time to close the connection is when your app is 
    //going to pause/stop. 
    database.close(); 
} 
Смежные вопросы