E/SQLiteLog?(1) 无此栏:nmb

Дан*_*цов 1 database sqlite android listview

当我尝试运行我的应用程序时,它崩溃了。

\n\n
E/SQLiteLog\xef\xb9\x95 (1) no such column: nmb\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的数据库代码

\n\n
private static final String DB_NAME = "mydb";\nprivate static final int DB_VERSION = 4;\nprivate static final String DB_TABLE = "mytab";\n\npublic static final String COLUMN_ID = "_id";\npublic static final String COLUMN_IMG = "img";\npublic static final String COLUMN_TXT = "txt";\npublic static final String COLUMN_NMB = "nmb";\n\nprivate static final String DB_CREATE =\n        "create table " + DB_TABLE + "(" +\n                COLUMN_ID + " integer primary key autoincrement, " +\n                COLUMN_IMG + " integer, " +\n                COLUMN_TXT + " text, " +\n                COLUMN_NMB + " number" +\n                ");";\n\nprivate final Context mCtx;\n\n\nprivate DBHelper mDBHelper;\nprivate SQLiteDatabase mDB1;\n\npublic DB2(Context ctx) {\n    mCtx = ctx;\n}\n\npublic void open() {\n    mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);\n    mDB1 = mDBHelper.getWritableDatabase();\n}\n\npublic void close() {\n    if (mDBHelper!=null) mDBHelper.close();\n}\n\n\n\npublic Cursor getAllData() {\n    String[] columns = {"_id","txt","img","nmb"};\n    return mDB1.query(DB_TABLE, columns, null, null, null, null, null);\n}\n\npublic void addRec(String txt, int img, String nmb) {\n    ContentValues cv = new ContentValues();\n    cv.put(COLUMN_TXT, txt);\n    cv.put(COLUMN_IMG, img);\n    cv.put(COLUMN_NMB, nmb);\n    mDB1.insert(DB_TABLE, null, cv);\n}\n\npublic void delRec(long id) {\n    mDB1.delete(DB_TABLE, COLUMN_ID + " = " + id, null);\n}\n\nprivate class DBHelper extends SQLiteOpenHelper {\n\n    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,\n                    int version) {\n        super(context, name, factory, version);\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        db.execSQL(DB_CREATE);\n\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的活动代码

\n\n
private static final int CM_DELETE_ID = 1;\nListView lvData;\nDB2 db;\nSimpleCursorAdapter scAdapter;\nCursor cursor;\nEditText et,nmb;\npublic void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_test4);\n    et =(EditText)findViewById(R.id.editText2);\n    nmb = (EditText)findViewById(R.id.nmb);\n    db = new DB2(this);\n    db.open();\n\n    cursor = db.getAllData();\n    startManagingCursor(cursor);\n\n    String[] from = new String[] { DB2.COLUMN_IMG, DB2.COLUMN_TXT, DB2.COLUMN_NMB };\n    int[] to = new int[] { R.id.ivImg, R.id.tvText, R.id.tvNmb };\n\n    scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to);\n    lvData = (ListView) findViewById(R.id.lvData);\n    lvData.setAdapter(scAdapter);\n\n    registerForContextMenu(lvData);\n\n}\n\n\n\npublic void onButtonClick(View view) {\n    db.addRec(et.getText().toString(), R.mipmap.ic_launcher, nmb.getText().toString());\n    cursor.requery();\n}\n\npublic void onCreateContextMenu(ContextMenu menu, View v,\n                                ContextMenu.ContextMenuInfo menuInfo) {\n    super.onCreateContextMenu(menu, v, menuInfo);\n    menu.add(0, CM_DELETE_ID, 0, R.string.delete_record);\n}\n\npublic boolean onContextItemSelected(MenuItem item) {\n    if (item.getItemId() == CM_DELETE_ID) {\n        AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();\n        db.delRec(acmi.id);\n        cursor.requery();\n        return true;\n    }\n    return super.onContextItemSelected(item);\n}\n\nprotected void onDestroy() {\n    super.onDestroy();\n    db.close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的第一个 DB_VERSION 中,我没有 COLUMN_NMB 并且它正在工作。另外,在“getAllData()”游标公共中,我只返回了 mDB1.query(DB_TABLE, null, null, null, null, null, null); 。添加 nmb 字符串后,它不断崩溃

\n

Fan*_*mas 5

疯狂猜测:您可能在第二时刻添加了该列。
卸载并重新安装您的应用程序。

这是因为,如果您不重新安装应用程序,则不会触及现有数据库。
或者如果您没有设置更高的 DATABASE_VERSION 值。