4

我想要一个简单的书签和/或我的应用程序的历史记录,我想知道最合适的存储是什么?文本文件或首选项中的文本,或者可能是数据库?哪个在更新中最灵活,对空间和查找时间最有效?

对于显示,我认为将是一个很好的起点,但是向某些项目添加图标会很容易吗?

编辑:

我终于设置了一个应该连接到数据库的书签活动:

/** 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);
        }
    });
}

书签.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)时,它并没有添加到数据库中。此外,我将数据添加到数据库中,但它没有显示在视图中。这里的光标/适配器有什么问题?完整来源在这里

4

3 回答 3

4

我建议,你去数据库。这将是满足您要求的简单有效的解决方案。

一张桌子sqlite就可以满足您的要求。因为您需要维护url您访问过的列表。该表也将满足您存储书签的要求。

你的表格格式可能是这样的。

_____________________________________________________________________________________
Id(Auto-increment) | Title of page | Url of Page |name of icon(if needed) |isBookmark |
_____________________________________________________________________________________

这可能是一个很好的结构来满足您的要求。将 isBookmark 设置为 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());
    }
}  

但是这种方法不太推荐。

于 2012-05-18T07:43:17.993 回答
2

我同意 WareNinja 的观点——SharedPreferences数据区域对于简单的非关系数据来说已经足够了。这个 SO 答案非常全面地描述了实现Activity和/或应用程序范围的 SharedPreferences 的细微差别。

SharedPreferences 框架将处理所有数据持久性,最大限度地减少您需要编写的代码量以及您对类似 db 的“更新”事务的暴露。但是请注意,在扩展您的应用程序方面,这种媒体功能强大但不够灵活。在您觉得需要扩展存储的数据类型的那一刻,转移到 SQLite 或类似的。

于 2012-05-21T16:03:20.707 回答
1

我建议使用 SharedPreferences 和/或 memdiskcache,它们都可以快速无缝地工作。ps 没有反对使用 sqlite,但是我总是尽量避免将 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);
            }
于 2012-05-18T08:46:26.910 回答