3

dbテーブルの「ORDERBY」を使用してすべてのdbエントリを並べ替えたい。何が間違っているのかわかりませんが、機能しません。
ここに私のコード:

class NoteHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "note.db";
private static final int SCHEMA_VERSION = 1;


public NoteHelper(Context context){
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db){
    db.execSQL("CREATE TABLE Notes (_id INTEGER PRIMARY KEY AUTOINCREMENT, note TEXT);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    //no-op, since will not be called until 2nd schema
    //version exists
}

public void insert(String note) {

    ContentValues cv = new ContentValues();
    cv.put("note", note);
    //you must pass it at lease one name of a colum
    getWritableDatabase().insert("Notes", "note", cv);
}

public void update(String id, String note){
    ContentValues cv = new ContentValues();
    String[] args = {id};

    cv.put("note", note);
    getWritableDatabase().update("Notes", cv, "_id=?", args);
}

public void delete(String id){
    getWritableDatabase().delete("Notes", "_id=?", new String[] {id});
}

public Cursor getAll(){
    return (getReadableDatabase().rawQuery("SELECT _id, note FROM Notes",  null));
}


public Cursor getAllSorted(){
    return (getReadableDatabase().rawQuery("SELECT note  FROM Notes  ORDER BY note  COLLATE NOCASE", null));

}

public String getNote(Cursor c){
    return(c.getString(1));
}

public Cursor getById(String id) {
    String[] args = {id};

    return(getReadableDatabase().rawQuery("SELECT _id, note FROM Notes WHERE _id=?", args));
}

 }

問題がどこにあるかを誰かが知っているなら、私を助けてください、ありがとう。

ここにメインコードがあります:

NoteAdapter adapter = null;
NoteHelper helper = null;
Cursor dataset_cursor = null;
EditText editNote = null;
//this is how track which note we are working on
String noteId = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    try{


    setContentView(R.layout.history);

    ListView list = (ListView)findViewById(R.id.list);
    editNote = (EditText)findViewById(R.id.myEditText);


    helper = new NoteHelper(this);
    dataset_cursor = helper.getAll();
    startManagingCursor(dataset_cursor);
    adapter = new NoteAdapter(dataset_cursor);
    list.setAdapter(adapter);
class NoteAdapter extends CursorAdapter {
    NoteAdapter(Cursor c){
        super(Ztutorial11.this, c);


    }




    public void bindView(View row, Context ctxt, Cursor c) {
        NoteHolder holder = (NoteHolder)row.getTag();
        holder.populateFrom(c, helper);
    }

    public View newView(Context ctxt, Cursor c, ViewGroup parent) {
        LayoutInflater inflater = getLayoutInflater();
        View row = inflater.inflate(R.layout.row, parent, false);
        NoteHolder holder = new NoteHolder(row);

        row.setTag(holder);
        return (row);
    }
}

static class NoteHolder {
    private TextView noteText = null;

    NoteHolder(View row){
        noteText = (TextView)row.findViewById(R.id.note);


    }

    void populateFrom(Cursor c, NoteHelper helper) {
        noteText.setText(helper.getNote(c));
    }
}



   public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater awesome = getMenuInflater();
awesome.inflate(R.menu.menu_expresions, menu);
return true;

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

    //something to do
    helper.getAllSorted();
    //update the view
    dataset_cursor.requery();
    return true;
case R.id.Za:

    //something to do

    return true;
case R.id.deleteall:

    //something to do
    helper.deleteAll();
    dataset_cursor.requery();
    return true;
case R.id.undo:

    //something to do

    return true;

}

return false;
 }



 };
4

3 に答える 3

2
dataset_cursor = helper.getAll();

使用していませんgetAllSorted()...

さらに、onOptionsItemSelected()はどこにも呼び出されておらず、呼び出されたとしても、への呼び出しへの戻り値getAllSorted()も使用されていません。

于 2012-08-14T17:56:36.750 に答える
1

そのようにしてみてください:

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.Az:
            dataset_cursor = helper.getAllSorted();
            adapter.changeCursor(dataset_cursor);
            return true;
        case R.id.Za:
            // something to do
            return true;
        case R.id.deleteall:
            // something to do
            helper.deleteAll();
            dataset_cursor.requery();
            adapter.notifyDataSetChanged();
            return true;
        case R.id.undo:
            // something to do
            return true;
    }
    return false;
}

最初に新しいソート結果を割り当ててからdataset_cursor、カーソルが変更されたことをアダプターに通知します。ケースには、deleteallおそらくadapter.notifyDataSetChanged();そこに追加した行が必要になります。

于 2012-08-14T18:10:42.333 に答える
1

私にはわかりませんが、ここにいくつかの推測/試してみることがあります。

1)ノートの後とCOLLATEの前に2つのスペースがあるようです。それが違いを生むかどうかはわかりません。(実際、そのSQL文字列のいくつかの異なる場所に余分なスペースがあるようです)

2)COLLATE NOCASE句を削除するとどうなりますか?それが問題なのか、それとも実際のORDERBY句が失敗しているのか疑問に思っています。

3)COLLATENOCASEの後にASC/ DESCを指定する必要がありますか?

于 2012-08-14T16:33:04.577 に答える