【问题标题】:SQLite Database error while trying to retrive values from database尝试从数据库中检索值时出现 SQLite 数据库错误
【发布时间】:2013-04-17 18:56:28
【问题描述】:

我有一个活动,我将值插入到 sqlite 表中,然后查询表以获取值。

活动

public class TableActivity extends Activity {

    TableLayout follow_up_table;
    TableRow followup_tr_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_table);

        follow_up_table=(TableLayout) findViewById(R.id.follow_up_table);

        //---------------Essay Title Table Header-----------------------------------------------
        TableRow essay_title_tr_head = new TableRow(this);
        essay_title_tr_head.setId(10);
        essay_title_tr_head.setBackgroundResource(R.drawable.list_header);
        essay_title_tr_head.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT,
        LayoutParams.WRAP_CONTENT));


        TextView label_essay_title = new TextView(this);
        label_essay_title.setId(20);
        label_essay_title.setText("Time");
        label_essay_title.setTextColor(Color.WHITE);
        label_essay_title.setPadding(5,5,5,5);
        essay_title_tr_head.addView(label_essay_title);// add the column to the table row here
        label_essay_title.setTextSize(12);    

        TextView label_description = new TextView(this);
        label_description.setId(20);
        label_description.setText("Student Name");
        label_description.setTextColor(Color.WHITE);
        label_description.setPadding(5,5,5,5);
        essay_title_tr_head.addView(label_description);// add the column to the table row here
        label_description.setTextSize(12);    



        follow_up_table.addView(essay_title_tr_head, new TableLayout.LayoutParams(
                LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));

      //---------------Essay Title Table Header-----------------------------------------------

        //getTime();

        // database handler
       insertData("Morning", "2013-04-23 10:00:00", "Suresh Kumar");
       insertData("Morning", "2013-04-23 11:30:00", "Pravat Das");
       insertData("Evening", "2013-04-23 16:16:00", "Namita Roy");
       insertData("Evening", "2013-04-23 17:30:00", "Rakesh Mitra");
       insertData("After noon", "2013-04-23 10:00:00", "Anil Sarma");

       getTime();
    }

    public void getTime()
    {
        // database handler
         // database handler
        DatabaseHandler db = new DatabaseHandler(getApplicationContext());

        // Spinner Drop down elements
        List<String> lables = db.getTime();
        Iterator itr = lables.iterator();
        while(itr.hasNext())
        {
            System.out.println(itr.next());
        }

    }

    //method to insert data into local database
    public void insertData(String timeName, String time, String studentName)
    {
        DatabaseHandler db = new DatabaseHandler(TableActivity.this);
        ContentValues values = new ContentValues();
        //db.createDataBase();
         values.put("timeName",timeName);
         values.put("time",time);
         values.put("studentName",studentName);

         db.insertValues(timeName, time, studentName);
        db.close();

    }

}

数据库助手类

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

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

    // Labels table name
    private static final String TABLE_LABELS = "follow_up";

    // Labels Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_time_name = "time_name";
    private static final String KEY_time = "time";
    private static final String KEY_student_name = "student_name";

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

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE follow_up (_id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , time_name VARCHAR, time DATETIME, student_name VARCHAR)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

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

        // Create tables again
        onCreate(db);
    }

    public void insertValues(String timeName, String time, String studentName)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        String sql = "INSERT INTO follow_up ( time_name, time, student_name) VALUES ('"+timeName+"', '"+time+"', '"+studentName+"')";
        Cursor cursor = db.rawQuery(sql, null); //<< execute here 
           cursor.moveToFirst();
           db.close();
    }


// 
//    /**
//     * Getting all labels
//     * returns list of labels
//     * */
    public List<String> getTime(){
        List<String> labels = new ArrayList<String>();

        // Select All Query
        String selectQuery = "SELECT time_name FROM follow_up ORDER BY time";

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                labels.add(cursor.getString(1));
            } while (cursor.moveToNext());
        }

        // closing connection
        cursor.close();
        db.close();

        // returning lables
        return labels;
    }
}

logcat中的错误

04-24 09:21:18.187: D/dalvikvm(1260): GC_FOR_ALLOC freed 66K, 7% free 2561K/2748K, paused 169ms, total 183ms
04-24 09:21:18.207: I/dalvikvm-heap(1260): Grow heap (frag case) to 3.222MB for 635812-byte allocation
04-24 09:21:18.328: D/dalvikvm(1260): GC_FOR_ALLOC freed 2K, 6% free 3179K/3372K, paused 116ms, total 116ms
04-24 09:21:18.467: D/dalvikvm(1260): GC_CONCURRENT freed <1K, 6% free 3190K/3372K, paused 9ms+27ms, total 141ms
04-24 09:21:19.167: E/CursorWindow(1260): Failed to read row 0, column 1 from a CursorWindow which has 5 rows, 1 columns.
04-24 09:21:19.167: D/AndroidRuntime(1260): Shutting down VM
04-24 09:21:19.167: W/dalvikvm(1260): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-24 09:21:19.197: E/AndroidRuntime(1260): FATAL EXCEPTION: main
04-24 09:21:19.197: E/AndroidRuntime(1260): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ica.dynamictable/com.ica.dynamictable.TableActivity}: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.os.Looper.loop(Looper.java:137)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invokeNative(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invoke(Method.java:511)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at dalvik.system.NativeStart.main(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.CursorWindow.nativeGetString(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.CursorWindow.getString(CursorWindow.java:434)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.commons.DatabaseHandler.getTime(DatabaseHandler.java:77)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.dynamictable.TableActivity.getTime(TableActivity.java:83)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.dynamictable.TableActivity.onCreate(TableActivity.java:73)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.Activity.performCreate(Activity.java:5104)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-24 09:21:19.197: E/AndroidRuntime(1260):     ... 11 more

实际上我要做的是将所有 time_name 放入一个列表中,以便我可以使用它填充一个表。

我哪里错了?

【问题讨论】:

    标签: java android sqlite select


    【解决方案1】:
    SELECT time_name FROM follow_up ORDER BY time
    

    仅包含 1 列。因此,它的索引为 0。您可以使用

    访问它
    labels.add(cursor.getString(0));
    

    或者,更干净:

    int index = cursor.getColumnIndex("time_name");
    

    labels.add(cursor.getString(index));
    

    另外,我应该补充一点,您的 if ... do ... while 可以替换为单个 while(cursor.moveToNext()) 块,因为新创建的光标的位置总是在第一个之前,使第一个 moveToNext 有效地等同于 @987654328 @

    【讨论】:

      【解决方案2】:

      cursor.getString(1) 应该是cursor.getString(0),因为在查询"SELECT time_name FROM follow_up ORDER BY time"; 中,您只会得到一个数据,即time_name0 中的索引0cursor.getString(0)

      【讨论】:

        【解决方案3】:

        在您的 DBHelper getTime() 方法中,您使用查询仅获取一行。稍后在该方法中您将使用labels.add(cursor.getString(1));

        您应该改用labels.add(cursor.getString(0));,因为Cursor 中只有一行

        【讨论】:

          猜你喜欢
          • 2023-03-17
          • 2016-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多