3

我在理解 Android SDK 中的搜索对话框时遇到了一些麻烦。

我的应用程序的“主要活动”提供了一个按钮。如果用户单击此按钮,则会调用搜索对话框。然后搜索本身在异步任务中完成,因为它可能需要一些时间。到现在为止还挺好。

主要活动还创建了一个数据库适配器对象,用于初始化数据库、执行查询等。但是如何在可搜索活动中使用此适配器对象?

主要活动
// Init database
DatabaseAdapter dba = new DatabaseAdapter();
dba.init();
// open search dialog
if (buttonClick) onSearchRequest();

可搜索的活动

  1. 从搜索对话框获取意图并接收查询 -> 确定
  2. 如何再次使用数据库适配器执行查询?

我必须创建一个新对象吗?我可以以某种方式将它从最小活动传递到可搜索活动,[...]?

谢谢,
罗伯特

4

3 回答 3

8

您可以在 Application 类中创建适配器,并在所有活动中检索它。这就是我为我的项目所做的。

public class ApplicationClass extends Application {

    Adapter adapter.

    @Override 
    public void onCreate(){
    adapter=new Adapter();
        super.onCreate();
    }

    public Adapter getAdapter(){
        return adapter;
    }

}

然后从 Activity 调用:

Adapter adapter=(ApplicationClass)getApplication().getAdapter();

类似的东西。ApplicationClass 用于您的应用名称。可能是 MyAppNameApplication 你应该在你的包中创建它,然后在 AndroidManifest.xml 中声明

于 2011-05-10T20:49:37.990 回答
3

一种选择是使用单例并通过静态方法提供对 DatabaseAdapter 的访问。前任:

private static DatabaseAdapter sWritableAdapter = null;
private static DatabaseAdapter sReadableAdapter = null;

public static DatabaseAdapter openForReading(Context ctx) {
    if(sReadableAdapter == null)
    sReadableAdapter = new DatabaseAdapter(new DatabaseHelper(ctx).getReadableDatabase());

    return sReadableAdapter;

}

或用于写访问:

public static DatabaseAdapter openForWriting(Context ctx) {
if(sWritableAdapter == null)
        sWritableAdapter = new DatabaseAdapter(new DatabaseHelper(ctx).getWritableDatabase());

    return sWritableAdapter;

}

因此,在您的可搜索活动中,您可以编写例如:

DatabaseAdapter adapter = DatabaseAdapter.openForReading(ctx);
adapter.searchSomething();

马可

于 2011-05-10T21:05:42.503 回答
0

你应该实现一个 ContentProvider

http://developer.android.com/guide/topics/providers/content-providers.html

它们是单例的,可以从(几乎)应用程序的任何地方访问。

于 2011-05-10T21:38:30.437 回答