Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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:SQLite插入异常_Android_Sqlite_Insert - Fatal编程技术网

Android:SQLite插入异常

Android:SQLite插入异常,android,sqlite,insert,Android,Sqlite,Insert,大家好,我正在试图找出代码中的插入异常。在我开始插入字符串之前,我想先插入我自己的字符串。然而,我从logcat得到一个错误。它们都是string类型,有一个主键行也设置为autoincrement。有人有什么指导吗 数据库活动 private static class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context){ super(context, DATABASE

大家好,我正在试图找出代码中的插入异常。在我开始插入字符串之前,我想先插入我自己的字符串。然而,我从logcat得到一个错误。它们都是string类型,有一个主键行也设置为autoincrement。有人有什么指导吗

数据库活动

private static class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context){
            super(context, DATABASE_NAME, null, DATABASE_VERSION);

        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + DATABASE_TABLE +  " (" +
                        KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        KEY_MODULECODE + " TEXT, " +
                        KEY_MODULENAME + " TEXT); "
                    );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABEL IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }

    public database(Context c){
        myContext = c;
    }

    public  database openToWrite()throws SQLException{
        myHelper = new DbHelper(myContext);
        moduleDatabase = myHelper.getWritableDatabase();
        return this;
    }

    public  database openToRead()throws SQLException{
        myHelper = new DbHelper(myContext);
        moduleDatabase = myHelper.getReadableDatabase();
        return this;
    }
    public void close(){
    myHelper.close();
    }

    public void createEntry(String moduleCode, String moduleName) throws SQLException {
        ContentValues cv = new ContentValues();
        cv.put(KEY_MODULECODE,moduleCode);
        cv.put(KEY_MODULENAME,moduleName);
        moduleDatabase.insert(DATABASE_TABLE,null,cv);
        // TODO Auto-generated method stub

    }

    public Cursor getData() {

        String[] columns = new String [] {KEY_ROWID,KEY_MODULECODE, KEY_MODULENAME};
        Cursor c = moduleDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

        return c;
    }
}

主要活动

public class MyCourses extends Activity {

    static final String TEST = "com.example.mycoursetimetable.TEST";
    String [] MODULE;
    database MODULEDATABASE;  
    ListView listContent;
    Boolean didItWork;


    Cursor cursor;

        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_my_courses);

       listContent =(ListView)findViewById(R.id.list);
       MODULEDATABASE = new database(MyCourses.this);

       MODULEDATABASE.openToWrite();
       MODULEDATABASE.createEntry("TestCode", "TestName");
       MODULEDATABASE.close();

       MODULEDATABASE.openToRead();
       cursor = MODULEDATABASE.getData();
       MODULEDATABASE.close();

       listContent = (ListView)findViewById(R.id.list);

       TestCursorAdapter ca = new TestCursorAdapter(this, cursor, 0);

       listContent.setAdapter(ca);

        }

}
草蛉

public class TestCursorAdapter extends CursorAdapter {

    private LayoutInflater viewInflater;
    boolean didItWork;

    public TestCursorAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);
        // TODO Auto-generated constructor stub
        viewInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public void bindView(View v, Context context, Cursor c) 
    {

        TextView text_modulecode = (TextView)v.findViewById(R.id.labelModuleCode);
        TextView text_modulename = (TextView)v.findViewById(R.id.labelEditModuleFull);

        text_modulecode.setText(String.valueOf(c.getColumnIndex(database.KEY_MODULECODE)));
        text_modulename.setText(String.valueOf(c.getColumnIndex(database.KEY_MODULENAME)));

    }

    @Override
    public View newView(Context context, Cursor c, ViewGroup parent) {
        View v = viewInflater.inflate(R.layout.listcourses, parent, false);
        return v;
    }

}
LogCat第80行表示moduleDatabase.insertDATABASE_表,null,cv

10-21 22:42:19.812: E/Database(19591): Error inserting module_name=TestName module_code=TestCode
10-21 22:42:19.812: E/Database(19591): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
10-21 22:42:19.812: E/Database(19591):  at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
10-21 22:42:19.812: E/Database(19591):  at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:66)
10-21 22:42:19.812: E/Database(19591):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1426)
10-21 22:42:19.812: E/Database(19591):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1286)
10-21 22:42:19.812: E/Database(19591):  at com.example.mycoursetimetable.database.createEntry(database.java:80)
10-21 22:42:19.812: E/Database(19591):  at com.example.mycoursetimetable.MyCourses.onCreate(MyCourses.java:48)
10-21 22:42:19.812: E/Database(19591):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-21 22:42:19.812: E/Database(19591):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
10-21 22:42:19.812: E/Database(19591):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
10-21 22:42:19.812: E/Database(19591):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
10-21 22:42:19.812: E/Database(19591):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
10-21 22:42:19.812: E/Database(19591):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-21 22:42:19.812: E/Database(19591):  at android.os.Looper.loop(Looper.java:123)
10-21 22:42:19.812: E/Database(19591):  at android.app.ActivityThread.main(ActivityThread.java:4363)
10-21 22:42:19.812: E/Database(19591):  at java.lang.reflect.Method.invokeNative(Native Method)
10-21 22:42:19.812: E/Database(19591):  at java.lang.reflect.Method.invoke(Method.java:521)
10-21 22:42:19.812: E/Database(19591):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
10-21 22:42:19.812: E/Database(19591):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-21 22:42:19.812: E/Database(19591):  at dalvik.system.NativeStart.main(Native Method)
10-21 22:42:19.862: E/Cursor(19591): Invalid statement in fillWindow()

您得到了游标错误:由于数据库设置不可靠,fillWindow中的语句无效。实际上,您关闭了数据库两次,然后将关闭的数据库和非活动的光标附加到listview上,似乎关闭了,对吗?最佳实践通常会说,先关闭光标,然后再关闭数据库对象,顺序是这样的。通常,当您完成查询时,可以将它们放在任何位置,但是由游标适配器支持的listview是特殊的。在listview打开并访问它的整个过程中,需要打开光标,以便数据源像任何数组对象或任何数据容器一样可用。否则,将出现一个错误,提示您试图重新打开已关闭的对象。所以最好的地方是在你的onDestroy方法中,当你的listview被根除的时候

@Override
    protected void onDestroy() {
        super.onDestroy();
        cursor.close();
        MODULEDATABASE.close();

    }
现在,我必须告诉您,我对您在同一活动中打开两个数据库实例有些不满。我可能会因为这样说而受到反对,但是.getWritableDatabase和.getReadableDatabase确实打开了相同的连接,它们没有太大的不同。关闭一个连接以打开另一个连接并不是一个好的做法,即使这看起来很谨慎。我并不是说你应该从应用程序中完全删除一个方法,而是在同一个活动生命周期中打开这两个方法是徒劳的。现在我们已经确定了光标必须在活动的整个过程中都处于打开状态,这一点更加正确。既然我们在讨论什么是必要的,什么不是,那么您实例化了listContent两次


很抱歉解释得太长,但我想确保细节已经清楚了。

可能与您的问题无关,但您在onUpgrade方法中拼写错误了表DROP TABEL IF EXISTS应该是DROP table IF EXISTS您是否检查了表的创建是否正确?我不确定如何检查其创建是否正确,不过,如果Oncreate方法不是这样,我预计它会出现编译器错误?@Barak感谢您的建议。不过还是没用。仅供参考,检查是否发生了什么事情的一个好方法是在方法中放入日志语句,它将显示在logcat上。例如,如果您想查看数据库是否已创建,可以将Log.idbOnCreate放入,数据库已创建!!!!;内,在关闭支架之前。但这是一个奇怪的问题。我会在insert语句中添加一个日志,然后在emulator中卸载应用程序并再次运行。我怀疑的是,您修复了id列声明的错误,但您的db没有机会升级它。感谢mango,虽然我确信这对我来说很明显是全新的,但我仍在努力解决某些方面的问题。在过去的几天里,你的帮助是无价之宝。我同情你,这一点问题都没有。我知道它是如何开始的,每次都会出错。不过我们都到了那里