如何使用存储在SD卡上的Sqlite数据库和文件同步我的Listview项目?

时间:2017-09-22 11:23:17

标签: android listview android-sqlite android-file

我正在研究一个电话录音机应用程序 1-通过服务和服务记录每个来电呼叫,保存SD卡中“My Call Recorder”文件夹中的每个文件,并将呼叫信息存储到sqlite数据库,如文件路径,来电号码,通话时长,通话日期和时间,呼叫类型(传入或传出)。 2.应用程序的MainActivity包含一个自定义列表视图,该视图使用简单光标适配器从该sqlite数据库填充。单击一个项目后,我从适配器获取游标对象,然后从中获取文件路径并打开另一个活动,然后使用该文件路径播放该媒体文件。这里用户可以删除,移动该媒体文件的副本。我可以在删除或移动文件时更新sqlite数据库条目。

问题 假设用户有10个呼叫被记录并存储在SD卡文件夹中,并且用户使用第三方文件管理器应用程序从“我的呼叫记录器”文件夹删除文件,但我的应用程序不知道它,当用户打开我的应用程序时,它仍然显示10个列表项,因为sqlite数据库仍然有10个条目。如何使用存储在SD卡上的文件更新我的sqlite?

修改 这是填充listview的方法。请建议在哪里实现该file.exists方法来检查每个文件?

 public void populateListview() {
    db = new DBSQL(MainActivity.this);
    cursor = db.getAllData();
    String[] from = new String[]{"displayname", "fileduration", "filedatetime", "calltype"};
    int[] to = new int[]{R.id.tvNumber, R.id.tvDuration, R.id.tvDateTime, R.id.img2};
    if (adapter == null) {
        adapter = new TodoCursorAdapter(MainActivity.this, R.layout.custom_listview, cursor, from, to);
        adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int i) {
                if (i == (cursor.getColumnIndex("displayname"))) {
                    String displayName = cursor.getString(i);
                    String contactName = getContactName(displayName, MainActivity.this);
                    TextView tv = (TextView) view;
                    if (contactName.isEmpty()) {
                        return false;
                    } else {
                        tv.setText(contactName);
                        return true;
                    }
                }
                return false;
            }
        });
        lv.setAdapter(adapter);

    } else {
        adapter.changeCursor(cursor);
    }

1 个答案:

答案 0 :(得分:0)

在显示列表时检查文件是否存在

File f = new File(filePathString);
if(f.exists())
{ 
 //do nothing
}
else
{
 //remove entry from SqLite Table
}

像这样编辑populateListview()

public void populateListview() {
db = new DBSQL(MainActivity.this);
cursor = db.getAllData();
String[] from = new String[]{"displayname", "fileduration", "filedatetime", "calltype"};
int[] to = new int[]{R.id.tvNumber, R.id.tvDuration, R.id.tvDateTime, R.id.img2};
if (adapter == null) {
    adapter = new TodoCursorAdapter(MainActivity.this, R.layout.custom_listview, cursor, from, to);
    adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int i) {

            if (i == (cursor.getColumnIndex("displayname"))) {
                File f = new File(filePathString);
                if(!(f.exists()))
                { 
                  deleteRecordWithId(itemId);
                  cursor.requery();
                  notifyDataSetChanged();
                }
                String displayName = cursor.getString(i);
                String contactName = getContactName(displayName, MainActivity.this);
                TextView tv = (TextView) view;
                if (contactName.isEmpty()) {
                    return false;
                } else {
                    tv.setText(contactName);
                    return true;
                }


            }
            return false;
        }
    });
    lv.setAdapter(adapter);

} else {
    adapter.changeCursor(cursor);
}