从多个片段保存到数据库

时间:2013-12-05 12:24:28

标签: android android-fragments

在我的Android应用程序中,我有一个带有标签的活动,每个标签都会更改为不同的片段,每个片段都有用户应填写的几个字段。然后,用户可以通过单击操作栏中的按钮来提交所有数据。

是否有一种简单的方法可以在操作栏按钮单击时访问和存储来自不同片段的所有数据?我在这里错过了什么吗?

4 个答案:

答案 0 :(得分:1)

如果我理解你的问题,我会看到两种可能的解决方案:

1)将片段中的数据复制到扩展Application类的类,以便该类作为全局变量的占位符。您只需捕获片段上的输入事件以更新类,或捕获片段转换以将数据从其复制到应用程序

2)您可以通过设置attachToRoot标志将片段的视图扩展到主要活动中。然后应该可以在主要活动中找到findViewById

答案 1 :(得分:0)

目前还不清楚你的意思是什么。如果要在手机上本地存储数据: Android Storage options 从这些我强烈建议SQLite用于更复杂的数据和共享首选项的简单(String或int)类型数据。

答案 2 :(得分:0)

当您在First Fragment中输入数据时,您可以通过逗号分隔值将所有数据存储到一个String中,然后将该值访问到第二个片段并拆分该字符串并将其存储到Sqlite DB中。

答案 3 :(得分:0)

如果我理解正确,您希望从应用的各个部分将数据保存到数据库中。我建议您使用ContentProvider / ContentResolver。使用这种方法,您将实现一个ContentProvider,它与您的数据库以及应用程序中的任何其他位置交互,您将使用ContentResolver与ContentProvider进行交互。

在ContentProvider中,您必须实现方法,query(),insert(),delete(),update(),onCreate()和getType()。 Uris用于标识要插入的内容或从ContentProvider中选择。您可以使用静态UriMatcher来非常简单地解析Uris。我将举例说明如何使用sqlite数据库实现查询方法:

您可以在提供商中定义UriMatcher:

private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
    // Here you define your Uris, in this case for a table I called TABLE_ONE.
    // If you want to know what each of these parameters means I suggest you view the documentation
    sURIMatcher.addURI(AUTHORITY, BASE_PATH, TABLE_ONE_ID);
}

// I suggest you define all constants like the AUTHORITY and BASEPATH and Uri's in a Contract class.
// You create the Uris from the value of AUTHORITY and BASE_PATH like this:
public static final Uri TABLE_ONE_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);

这是查询方法的基本实现:

public Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    Cursor c = null;

    // The UriMatcher gives you the id of the uri if you added it like in the above example
    int uriId = sURIMatcher.match(uri);
    switch (uriId ) {
        case TABLE_ONE_ID:
            SQLiteDatabase db = database.getWritableDatabase();
            c = db.query(TABLE_ONE_NAME, projecton, selection, selectionArgs, sortOrder);
            c.setNotificationUri(getContext().getContentResolver(), uri);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI: " + uri);
    }

    return c;
}

然后在您的应用中,您可以使用ContentResolver从数据库中选择数据:

// Note that getContentResolver is a method of Activity, in a Fragment you have to call getActivity().getContentResolver()
getContentResolver().query(TABLE_ONE_URI, projection, selection, selectionArgs, sortOrder);

以下是完整教程的链接,其中包含有关Android中SQLite和ContentProviders的重要内容:
http://www.vogella.com/articles/AndroidSQLite/article.html
在这里,您可以找到Google关于如何实施ContentProvider的官方指南:
http://developer.android.com/guide/topics/providers/content-provider-creating.html