0

タブで作ったアプリがあります。1つのタブは、メソッドget_data()(別のクラスから呼び出される)を使用して、dbからデータを取得します。

正常に動作しますが、別のタブから行われた変更、または識別されたタブで行われた変更(DELETEやUPDATEのように変更された)は表示されません。例:

dbから取得したデータを含むタブ(リストビューを使用)に移動し、レコードを削除してから、別のタブに移動して、リストを含むタブに戻ります。削除された行が表示されます。アプリを閉じて再度開くと、変更が表示されます。

「データベースをリロードする」方法はありますか?

これがコード(view.class)、タブからのリーダーです:

public class Bookmarks extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bookmarks);
    final Database info=new Database(this);
    final Timer t = new Timer();
    info.open();
    String data=info.getData();
    final String[] data_array = data.split(",");
    info.close();
    final ListView listView1 = (ListView) findViewById(R.id.list_mia);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data_array);
    listView1.setAdapter(adapter);
    final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    listView1.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id){
            if(data_array[position].startsWith("http://")){
                Uri uri=Uri.parse((String) data_array[position]);
                Intent intent=new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }else{
                alertDialog.setTitle("Content");
                alertDialog.setMessage(data_array[position]);
                alertDialog.setIcon(R.drawable.ic_launcher);
                alertDialog.show();
            }
        }
    });
    listView1.setOnItemLongClickListener(new OnItemLongClickListener(){
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View v, final int position, long id) {
            builder.setTitle("Delete")
                .setMessage("Are you sure to remove this entry?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        info.open();
                        info.deleteEntry(position+1);
                        info.close();
                        alertDialog.setTitle("Delete");
                        alertDialog.setMessage("Item deleted successfully!");
                        alertDialog.setIcon(R.drawable.ic_launcher);
                        alertDialog.show();
                        t.schedule(new TimerTask() {
                            public void run() {
                                alertDialog.dismiss();
                                t.cancel();
                            }
                        },2000);
                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {}
                })
            .show();
            return false;
        }
    });
}
}

および呼び出されるメソッド(db.class内):

public String getData() {
    String[] columns=new String[]{KEY_ROWID,KEY_CONTENUTO};
    Cursor c=ourDatabase.query(DATABASE_TABLE,columns,null,null,null,null,"id");
    String result="";
    int iRow=c.getColumnIndex(KEY_ROWID);
    int iName=c.getColumnIndex(KEY_CONTENUTO);
    for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        result=result+c.getString(iName)+',';
    }
    result=result.substring(0, result.length()-1);
    return result;
}

誰かが私を助けることができますか?

4

2 に答える 2

1

データベース内の情報を削除または更新する場合は、以下のようなメソッドを作成する必要があります。同じアクティビティ内でこのメソッドを呼び出すと、データがフェッチされ、リストが再読み込みされます。

   setData() {

    info.open();
    String data=info.getData();
    final String[] data_array = data.split(",");
    info.close();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data_array);
    listView1.setAdapter(adapter);

        }

PS:上記のコードは、dbの削除または更新時に基本的にリストをリロードできるというヒントを提供するためのものです。正確な解決策ではありません。

于 2012-07-09T14:45:36.040 に答える
0

なぜそんなに余分な処理をしているのか聞いてもいいですか?カーソルをクエリし、結果を連結し、連結された結果を返し、それらを再度分割します。それはプロセッサに少し集中的です。

SimpleCursorAdapterでカーソルを直接使用しないのはなぜですか?次に、を使用requery()してリストを更新します。

次の変更でそれを行うことができます:

public class Bookmarks extends Activity{ 
@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.bookmarks); 
    final Database info=new Database(this); 
    final Timer t = new Timer(); 
    info.open(); 
    Cursor data=info.getData(); 
    final ListView listView1 = (ListView) findViewById(R.id.list_mia); 
    String[] from = new String[] { db.KEY_CONTENUTO };
    int[] to = new int[] { android.R.id.text1 };
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1, data, from, to); 
    listView1.setAdapter(adapter); 

    final AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    listView1.setOnItemClickListener(new OnItemClickListener(){ 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view,int position, long id){ 
            if(view.getText().toString().startsWith("http://")){ 
                Uri uri=Uri.parse(view.getText().toString()); 
                Intent intent=new Intent(Intent.ACTION_VIEW, uri); 
                startActivity(intent); 
            }else{ 
                alertDialog.setTitle("Content"); 
                alertDialog.setMessage(view.getText().toString()); 
                alertDialog.setIcon(R.drawable.ic_launcher); 
                alertDialog.show(); 
            } 
        } 
    }); 
    listView1.setOnItemLongClickListener(new OnItemLongClickListener(){ 
        @Override 
        public boolean onItemLongClick(AdapterView<?> parent, View v, final int position, long id) {  
        long rowId = id;
        builder.setTitle("Delete") 
            .setMessage("Are you sure to remove this entry?") 
            .setCancelable(false) 
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int id) { 
                    info.deleteEntry(rowId); 
                    data.requery();
                    alertDialog.setTitle("Delete"); 
                    alertDialog.setMessage("Item deleted successfully!"); 
                    alertDialog.setIcon(R.drawable.ic_launcher); 
                    alertDialog.show(); 
                    t.schedule(new TimerTask() { 
                        public void run() { 
                            alertDialog.dismiss(); 
                            t.cancel(); 
                        } 
                    },2000); 
                } 
            }) 
            .setNegativeButton("No", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int id) {} 
            }) 
        .show(); 
        return false; 
    } 
}); 

}}

public Cursor getData() { 
    String[] columns=new String[]{KEY_ROWID,KEY_CONTENUTO}; 
    Cursor c=ourDatabase.query(DATABASE_TABLE,columns,null,null,null,null,"id"); 
    return c; 
} 
于 2012-07-09T15:16:16.193 に答える