我想为我的应用添加一个简单的书签和/或历史记录,我想知道最合适的存储是什么?文本文件或首选项中的文本,还是数据库?哪个更新最灵活,空间和查找时间有效?
对于显示器,我认为this是一个很好的起点,但是在某些项目上添加图标会很容易吗?
修改
我最终设置了一个应该连接到数据库的书签活动:
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bookmarkview);
Cursor cursor = managedQuery(getIntent().getData(), new String[] {Bookmark.TITLE, Bookmark.URL},
null, null, Bookmark.DEFAULT_SORT_ORDER);
setListAdapter(new SimpleCursorAdapter(this, R.layout.bookmarkitem, cursor,
new String[] { Bookmark.TITLE }, new int[] { android.R.id.text1 }));
findViewById(R.id.addBookmark).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put("url", _url);
values.put("title", _title);
// When the update completes,
// the content provider will notify the cursor of the change, which will
// cause the UI to be updated.
getContentResolver().update(_myuri, values, null, null);
}
});
}
Bookmark.java:
package com.tunes.viewer.Bookmarks;
import android.net.Uri;
import android.provider.BaseColumns;
/*
* Database will have:
* pk - primary key
* title - the name of the bookmark.
* url - the url.
*/
public class Bookmark implements BaseColumns{
public static final String AUTHORITY = "com.tunes.viewer";
/**
* The content:// style URL for this table
*/
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/Bookmarks");
/**
* The MIME type of {@link #CONTENT_URI} providing a directory of notes.
*/
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note";
/**
* The MIME type of a {@link #CONTENT_URI} sub-directory of a single note.
*/
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note";
/**
* The default sort order for this table
*/
public static final String DEFAULT_SORT_ORDER = "title";
/**
* The title of the note
* <P>Type: TEXT</P>
*/
public static final String TITLE = "title";
/**
* The url
* <P>Type: TEXT</P>
*/
public static final String URL = "url";
}
我似乎修复了我遇到的大部分问题,但遗憾的是,当我点击“添加”按钮(调用上面的onclick)时,它不会添加到数据库中。此外,我将数据添加到数据库,但它没有显示在视图中。这里的光标/适配器有什么问题?完整来源是here。
答案 0 :(得分:4)
我建议你去数据库。这将是您的需求的简单而有效的解决方案。
sqlite
中的单个表格可满足您的要求。因为您需要维护一个您访问过的url
列表。此表还将满足您存储书签的要求。
您的表格格式可能是这样的。
_____________________________________________________________________________________
Id(Auto-increment) | Title of page | Url of Page |name of icon(if needed) |isBookmark |
_____________________________________________________________________________________
这可能是一个很好的结构来满足您的要求。将ismarkmark设置为0/1将特定链接设置为书签或取消标记。
编辑
我没有建议您使用SharedPreferences而我不会(虽然它是直接的,易于实现),理由在于对SharedPreferences的定义如下:
“ SharedPreferences类提供了一个通用框架,允许您保存和检索原始数据类型的持久键值对。您可以使用SharedPreferences保存任何原始数据:布尔值,浮点数,整数,长整数和字符串即可。“
现在我无法想象将ArrayList<String>
(Urls)存储在其中一种原始数据类型中的单一方法。
还有一个解决方法。它是对象序列化。您可以将完整的arraylist实例保存到文件中,下次需要此对象时,可以类似地对其进行解除分类。以下是序列化的示例代码。
。
public void serializeMap(ArrayList<String> list) {
try {
FileOutputStream fStream = openFileOutput(namefile.bin, Context.MODE_PRIVATE) ;
ObjectOutputStream oStream = new ObjectOutputStream(fStream);
oStream.writeObject(list);
oStream.flush();
oStream.close();
Log.v("Serialization success", "Success");
} catch (Exception e) {
Log.v("IO Exception", e.getMessage());
}
}
但是这种方法并不多见。
答案 1 :(得分:2)
我同意WareNinja- SharedPreferences
数据区域对于简单的非关系数据就足够了。 This SO answer非常全面地描述了实施Activity
和/或应用程序范围的SharedPreferences的细微差别。
SharedPreferences框架将处理所有数据持久性,最大限度地减少您需要编写的代码量以及类似数据库更新的风险。交易。 但请注意,在扩展您的应用程序方面,这种媒介功能强大但不灵活。您觉得需要扩展存储的数据类型的那一刻转移到SQLite或类似的。
答案 2 :(得分:1)
我建议使用SharedPreferences和/或memdiskcache,两者都可以快速无缝地工作。 附:没有反对使用sqlite,但我总是尽量避免使用db for client apps。
示例lib来抽象本地存储(没有db!); https://github.com/wareninja/generic-store-for-android
您可以按键值形式存储和检索任何类型的数据,
从memdiskcache加载java对象的示例代码;
String keyPrefix = "blabla1";
if (GenericStore.isCustomKeyExist(GenericStore.TYPE_MEMDISKCACHE, keyPrefix, this)) {
mNewPoiDataList = (NewPoiDataList)GenericStore.getObject(GenericStore.TYPE_MEMDISKCACHE
, keyPrefix, this);
}