0

次のコードを使用して、sqlite からのデータを listView に表示しています

public class AndroidSQLite extends Activity {

ListView listContent;
private SQLiteAdapter mySQLiteAdapter;
Button addZekr;
EditText zekrTxtEditor;

String[] items;
 boolean[] itemsChecked ;

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


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

    mySQLiteAdapter = new SQLiteAdapter(this);
    mySQLiteAdapter.openToWrite();
    mySQLiteAdapter.deleteAll();

    mySQLiteAdapter.insert(getResources().getString(R.string.zekr1));
    mySQLiteAdapter.insert(getResources().getString(R.string.zekr2));
    mySQLiteAdapter.insert(getResources().getString(R.string.zekr3));
    mySQLiteAdapter.insert(getResources().getString(R.string.zekr4));
    mySQLiteAdapter.insert(getResources().getString(R.string.zekr5));

    // Open the same SQLite database and read all it's content.
    mySQLiteAdapter = new SQLiteAdapter(this);
    setDataInList();

    Button addZekr = (Button) findViewById(R.id.addZekrBtn);
    addZekr.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {

            zekrTxtEditor = (EditText)findViewById(R.id.zekr_text);
            String newZekr = zekrTxtEditor.getText().toString();
            System.out.println("newZekr: "+newZekr);
             mySQLiteAdapter.openToWrite();
             mySQLiteAdapter.insert(newZekr); 


             setDataInList();

            }
        });

    mySQLiteAdapter.close();


    listContent.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> parentView, View childView,
                int position, long id) {
            // TODO Auto-generated method stub

            String itemPostion = listContent.getItemAtPosition(position).toString();
            System.out.println("in Long Press itemPostion: "+itemPostion);

            return false;
        }

    });

    listContent.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parentView, View childView,
                int position, long id) {
            // TODO Auto-generated method stub
            String itemPostion = listContent.getItemAtPosition(position).toString();
            System.out.println("in Normal Press itemPostion: "+itemPostion);
        }
    });

}

 public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.delete: {

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Dialog with simple text");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {


                    for (int i = 0; i < items.length; i++) {
                    if (itemsChecked[i]) {
                        Toast.makeText(getBaseContext(), items[i] + " checked!", Toast.LENGTH_LONG).show();
                    }
                }
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_LONG).show();
                }
            });
            builder.setMultiChoiceItems(items, itemsChecked, new DialogInterface.OnMultiChoiceClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                    Toast.makeText(getBaseContext(), items[which] + (isChecked ? "checked!" : "unchecked!"), Toast.LENGTH_SHORT).show();
                }
            });
            builder.create();
            builder.show();
        }

        break;
        }
        return true;
    }


public void setDataInList(){

        mySQLiteAdapter.openToRead();

        Cursor cursor = mySQLiteAdapter.queueAll();
        startManagingCursor(cursor);

        items = new String[]{SQLiteAdapter.KEY_CONTENT};
        int[] to = new int[]{R.id.text};

        String myContent = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_CONTENT)).toString().trim();

       // long id = cursor.getLong(cursor.getColumnIndex(SQLiteAdapter.KEY_ID));

        System.out.println("itemssss: "+myContent);

        itemsChecked = new boolean[items.length];

        SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.row, cursor, items, to);

        listContent.setAdapter(cursorAdapter);

        mySQLiteAdapter.close();
}

}

私がしたいのは、KEY_CONTENT列のデータを取得し、それらを配列に入れてAlertDialogに表示することです

だから私はこの行を入れました

String myContent = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_CONTENT)).toString().trim();

しかし、それは私にこの例外を与えます:

CursorIndexOutOfBoundsException: サイズ 5 のインデックス -1 が要求されました

助けはありますか?

4

1 に答える 1

0

例外は、最初の行が作成されたときのように、カーソルが最初の行のに配置されることを意味します。moveToFirst()を使用して最初の行に移動する必要があります

例えば ​​:

if (moveToFirst()) {
    String myContent = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_CONTENT)).toString().trim();
    ...
} else {
   // no data
}

あるいは、たとえばループでmoveToNext()を使用することもできます。

于 2013-01-30T16:07:26.453 に答える