线程中的简单查询游标找不到值



由于某些原因,在下面的函数中游标没有读取任何标记。我不知道我做错了什么,我一直在为我们调试这个代码。当它运行时,它说tagid和catid的值都是-1。没有乒乓球或乒乓

public String getCategoryNameByLawId(final int lawID){
    final String[] categoryName = {"Success"+lawID};
    final int[] tagID = {-1};
    final int[] categoryID =  {-1};
    runnable = new Runnable() {
        @Override
        public void run() {
            try {
                openToRead();
                String Query = "SELECT * from " + Constants.TABLE_LAW_TAG;
                Cursor c1 = mSqLiteDatabase.rawQuery(Query, null);
                if (c1.moveToFirst()) {
                    categoryName[0] = "ping";
                    while (c1.isAfterLast() == false) {
                        categoryName[0] = "pong";
                        try {
                            if (c1.getInt(c1.getColumnIndex(Constants.KEY_LAW_ID)) == lawID) {
                                int indexTagID = c1.getColumnIndex(Constants.KEY_TAG_ID);
                                tagID[0] = c1.getInt(indexTagID);
                                categoryName[0] = "pang";
                            }
                        } catch (Exception e) {
                            categoryName[0] = e.getMessage();
                        }
                        c1.moveToNext();
                    }
                }
                close();
                openToRead();
                Query = "SELECT * from " + Constants.TABLE_CATEGORY_TAG;
                Cursor c2 = mSqLiteDatabase.rawQuery(Query, null);
                if (c2.moveToFirst()) {
                    while (c2.isAfterLast() == false) {
                        if (c2.getInt(c2.getColumnIndex(Constants.KEY_TAG_ID)) == tagID[0]) {
                            int indexCategoryID = c2.getColumnIndex(Constants.KEY_CATEGORY_ID);
                            categoryID[0] = c2.getInt(indexCategoryID);
                        }
                        c2.moveToNext();
                    }
                }
                /*
                exceptionHandler.alert(new RuntimeException(), "catid-" + categoryID[0]);
                Query = "SELECT * from " + Constants.TABLE_CATEGORY;
                Cursor c3 = mSqLiteDatabase.rawQuery(Query, null);
                if (c3.moveToFirst()) {
                    while (c3.isAfterLast() == false) {
                        if (c3.getInt(c3.getColumnIndex(Constants.KEY_CATEGORY_ID)) == categoryID[0]) {
                            int indexCategoryName = c3.getColumnIndex(Constants.KEY_CATEGORY_NAME);
                            categoryName[0] = c3.getString(indexCategoryName);
                        }
                        c3.moveToNext();
                    }
                }
                exceptionHandler.alert(new RuntimeException(), "catnam-" + categoryName[0]);*/
                close();
            }
            catch(Exception e){
                categoryName[0] ="error";
            }
        }
    };
    new Thread(runnable).start();
    return categoryName[0].toLowerCase() + " tagid: "+ tagID[0]+ " catid: "+ categoryID[0];
}

start()刚刚启动线程;它不等待它完成。问题是,当您执行return categoryName[0]...时,值还没有被发现。

间接删除Runnable,直接执行数据库代码

如果您真的想使用一个线程,您可以等待线程完成(调用它的join()),但是这没有意义,因为只要数据库代码在运行,主线程就会挂起。为了能够在主线程中做其他事情,您必须重新组织您的程序,以便数据库代码在得到结果时向主线程发送单独的消息。让它看看CursorLoader(它需要一个内容提供程序,虽然)。

最新更新