android - 完成尚未停用或关闭的游标,并且在 sqlite 中没有此类表列表项

标签 android android-sqlite

自从我向数据库添加新表以来,我一直收到此错误,不知道为什么。我已经做过几次这种方法,没有遇到任何错误,但现在发生了这种情况,sqlite 就像女人一样,你第一次做某事,一切看起来都很好,但当你再次做同样的事情时,他们就会开始疯狂出于某种原因。

无论如何,这里有一些相关代码:

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.selectorcreatemove);

        allFunctions();

    }

    private void allFunctions() {
        addMove = (Button) findViewById(R.id.bAddMove);
        etAddMove = (EditText) findViewById(R.id.etMoveName);

        MoveList = (ListView) findViewById(R.id.lvMoveItems);
        SQLHandlerview = new SQLHandler(this);

        SQLHandlerview = new SQLHandler(ListMovingNames.this);
        SQLHandlerview.open();

        cursor = SQLHandlerview.getMove();
        startManagingCursor(cursor);

        String[] from = new String[]{SQLHandler.KEY_MOVENAME};
        int[] to = new int[]{R.id.text};

        SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);
        MoveList.setAdapter(cursorAdapter);

        addMove.setOnClickListener(new OnClickListener() {

            @SuppressLint("NewApi")
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });

        MoveList.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, final View view, int position,
                    long id) {
                // TODO Auto-generated method stub
                AlertDialog load = new AlertDialog.Builder(ListMovingNames.this).show();
                load.setContentView(R.layout.load);
                move = ((TextView) view).getText().toString();
                Intent i = new Intent(getApplicationContext(), StartMoving.class);
                i.putExtra("moveName", move);
                startActivity(i);               
            }
        });

        etAddMove.setOnKeyListener(new OnKeyListener() {

            @SuppressLint("NewApi")
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                if ( (event.getAction() == KeyEvent.ACTION_DOWN  ) && (keyCode== KeyEvent.KEYCODE_ENTER)   )
                {               
                    String ssmoveName = etAddMove.getText().toString();
                    int x = ssmoveName.length() - 1;
                    if (ssmoveName.equals("") || Character.isWhitespace(ssmoveName.charAt(0)) || Character.isWhitespace(ssmoveName.charAt(x))) {
                        Toast.makeText(ListMovingNames.this, 
                                "Please enter a valid name! Avoid giving a blank name or white space at the beginning or end of the name", 
                                Toast.LENGTH_LONG).show();
                    }else{
                        try {
                            String scheck = SQLHandlerview.checkMove(ssmoveName);
                            if (scheck.equals(ssmoveName)) {
                                Toast.makeText(ListMovingNames.this, "Move name already exist please give a different name", Toast.LENGTH_LONG).show();
                            } else{
                                AlertDialog load = new AlertDialog.Builder(ListMovingNames.this).show();
                                load.setContentView(R.layout.load);
                                SQLHandlerview.createMove(ssmoveName);
                                SQLHandlerview.createList();
                                SQLHandlerview.setTodo(ssmoveName);
                                Intent i = new Intent(getApplicationContext(), StartMoving.class);
                                i.putExtra("moveName", ssmoveName);
                                startActivity(i);
                            }
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            AlertDialog load = new AlertDialog.Builder(ListMovingNames.this).show();
                            load.setContentView(R.layout.load);
                            SQLHandlerview.createMove(ssmoveName);
                            SQLHandlerview.createList();
                            SQLHandlerview.setTodo(ssmoveName);
                            Intent i = new Intent(getApplicationContext(), StartMoving.class);
                            i.putExtra("moveName", ssmoveName);
                            startActivity(i);
                        }
                    }
                    return true;
                }
                return false;
            }
        });

    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        allFunctions();
        SQLHandlerview.open();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        if (SQLHandlerview != null) {
            SQLHandlerview.close();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            // do something on back.

            Intent i = new Intent(ListMovingNames.this, MainActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

}

这是 sql 处理程序

public class SQLHandler {

    public static final String KEY_MOVENAME = "movename";
    public static final String KEY_ID1 = "_id";
    public static final String KEY_ID5 = "_id";

    public static final String KEY_MOVEDATE = "movedate";
    public static final String KEY_TOTALMOVEWEIGHT = "totalmoveweight";
    public static final String KEY_TOTALITEM = "totalitem";

    private static final String DATABASE_NAME = "mymovingfriend";
    private static final int DATABASE_VERSION = 1;

    public static final String KEY_LISTITEMNAME = "listitemname";
    public static final String KEY_LISTITEMWEIGHT = "listitemweight";
    public static final String KEY_LISTITEMROOM = "listitemroom";

    private static final String DATABASE_TABLE1 = "movingname";
    private static final String DATABASE_TABLE5 = "lisitem";

    public static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE1 + " (" + 
            KEY_ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_MOVEDATE + " TEXT NOT NULL, " + 
            KEY_TOTALMOVEWEIGHT + " TEXT NOT NULL, " + 
            KEY_TOTALITEM + " INTEGER NOT NULL, " +
            KEY_MOVENAME + " TEXT NOT NULL);";

    public static final String CREATE_TABLE_5 = "CREATE TABLE " + DATABASE_TABLE5 + " (" + 
            KEY_ID5 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_LISTITEMNAME + " TEXT NOT NULL, " + 
            KEY_LISTITEMWEIGHT + " TEXT NOT NULL, " +
            KEY_LISTITEMROOM + " TEXT NOT NULL);";

    private DbHelper ourHelper;
    private final Context ourContext;
    private SQLiteDatabase ourDatabase;

    private static class DbHelper extends SQLiteOpenHelper{

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(CREATE_TABLE_1);
            db.execSQL(CREATE_TABLE_5);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE1);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE5);
            onCreate(db);
        }
    }

    public SQLHandler(Context c){
        ourContext = c;
    }

    public SQLHandler open() throws SQLException{
        ourHelper = new DbHelper(ourContext);
        ourDatabase = ourHelper.getWritableDatabase();
        return this;
    }

    public void close(){
        ourDatabase.close();
        ourHelper.close();
    }

    public long createMove(String smovename){
        ContentValues cv = new ContentValues();
        cv.put(KEY_MOVENAME, smovename);
        cv.put(KEY_MOVEDATE, "Not yet set");
        cv.put(KEY_TOTALMOVEWEIGHT, "0");
        cv.put(KEY_TOTALITEM, 0);
        return ourDatabase.insert(DATABASE_TABLE1, null, cv);
    }

    public void createList(){
        ContentValues cv = new ContentValues();

        String[] sroom = new String[]{"Kitchen", "Bedroom", "Dinning Room"};
        String[] sitem = new String[]{"Dishwasher", "Bed", "Table"};
        String[] sweight = new String[]{"40", "25", "15"};

        for (int i = 0; i < sroom.length; i++) {
            cv.put(KEY_LISTITEMROOM, sroom[i]);
            cv.put(KEY_LISTITEMNAME, sitem[i]);
            cv.put(KEY_LISTITEMWEIGHT, sweight[i]);
            ourDatabase.insert(DATABASE_TABLE5, null, cv);
        }
    }

    public ArrayList<String> getitems(){
        String[] columns = new String[]{KEY_ID5, KEY_ITEMNAME};
        Cursor c = ourDatabase.query(DATABASE_TABLE5, columns, null, null, null, null, null);
        ArrayList<String> items = new ArrayList<String>();

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            items.add(c.getString(1));
        }

        return items;
    }

    public ArrayList<String> getitemweight(){
        String[] columns = new String[]{KEY_ID5, KEY_ITEMWEIGHT};
        Cursor c = ourDatabase.query(DATABASE_TABLE5, columns, null, null, null, null, null);
        ArrayList<String> items = new ArrayList<String>();

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            items.add(c.getString(1));
        }

        return items;
    }

    public ArrayList<String> getitemclass(){
        String[] columns = new String[]{KEY_ID5, KEY_LISTITEMROOM};
        Cursor c = ourDatabase.query(DATABASE_TABLE5, columns, null, null, null, null, null);
        ArrayList<String> items = new ArrayList<String>();

        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            items.add(c.getString(1));
        }

        return items;
    }

}

最佳答案

私有(private)静态最终 int DATABASE_VERSION = 1;

该值仍然等于 1。我假设这是您在创建数据库时使用的值。 onCreate() 仅在第一次在设备上调用 DbHelper 时调用。除非 DATABASE_VERSION 的值发生更改,否则不会调用 onUpgrade。这意味着您的新表从未在数据库中实际创建。

尝试设置 DATABASE_VERSION = 2。

------编辑-----

DATABASE_TABLE5 的值似乎存在拼写错误。

私有(private)静态最终字符串DATABASE_TABLE5 =“lisitem”;

----如果查询返回 0 个结果,for 循环将失败-----

用途:

如果(c.moveToFirst()){

do{
    items.add(c.getString(1);
    c.moveToNext();
}while(!c.isAfterLast());

}

关于android - 完成尚未停用或关闭的游标,并且在 sqlite 中没有此类表列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945974/

相关文章:

java - 为什么我的光标计数为0?

java - 错误 : sqlite returned: error code = 1, msg = 没有这样的表

android - 如何在TableView中打印数据库中的数据?

Android布局: group dynamic elements

android - 亚行没有回应。您可以等待更多,或者手动杀死 "adb.exe"进程并单击 'Restart'

java - Rest API + Json 响应编码错误(我认为)

android - 如何在第一次返回 true 后停止接收手势的 onTouchEvents

Android fragment 事务 : How to generate an overlay slide in and move existing Fragement to left

android:如何在不运行模拟器的情况下操作sqlite数据库?

android - ActiveAndroid:锁定更新记录?