gpt4 book ai didi

android - Android Activity 类中的面向对象范围和继承

转载 作者:搜寻专家 更新时间:2023-10-30 20:45:40 25 4
gpt4 key购买 nike

我对面向对象编程还是很陌生,并且在类继承和从一个实例化类到另一个实例化类的变量范围方面遇到了问题。

我正在尝试构建一个 android 应用程序,它可以读取多个 XML 提要并将它们保存到手机的 SQLite 数据库中。每个提要都有不同的名称(“新闻”、“audio_mixes”等),我想使用这些名称将每个提要的数据保存到单独的数据库表中 - 每个表都以提要标题命名。

用图形术语来说,这就是我的类(class)的样子: alt text
(来源:baroquedub.co.uk)

Main Activity 显示两个按钮,每个按钮启动一个 Activity - 两者都是 TitlesBrowser 类的实例。 Extras 用于传递 the_urlthe_feed_type 变量的不同值。

@Override
public void onCreate(final Bundle icicle) {
super.onCreate(icicle);
this.setContentView(R.layout.main);

this.getNewsButton = (Button) findViewById(R.id.get_news_button);
this.getNewsButton.setOnClickListener(new OnClickListener() {

public void onClick(final View v) {
Intent doGetNews = new Intent(Main.this, TitlesBrowser.class);
doGetNews.putExtra("the_url", Main.this.getString(R.string.titles_url));
doGetNews.putExtra("the_feed_type", Main.this.getString(R.string.news_type_var));
startActivity(doGetNews);
}
});

this.getMixtapesButton = (Button) findViewById(R.id.get_mixtapes_button);
this.getMixtapesButton.setOnClickListener(new OnClickListener() {

public void onClick(final View v) {
Intent doGetMixtapes = new Intent(Main.this, TitlesBrowser.class);
doGetMixtapes.putExtra("the_url", Main.this.getString(R.string.titles_url));
doGetMixtapes.putExtra("the_feed_type", Main.this.getString(R.string.mixtapes_type_var));
startActivity(doGetMixtapes);
}
});

}

TitlesBrowser 类,在其 onCreate 方法中获取 Extras 并将它们保存到私有(private)局部变量中。

Intent i = getIntent();
private String theUrl = (String) i.getStringExtra("the_url");
private String theFeedType = (String) i.getStringExtra("the_feed_type");</pre>

这个类做了两件事,

1/它创建 DatabaseHelper 类的实例,并使用该类中的公共(public)设置方法传递本地帮助 theFeedType 变量的值。完成后,它会查询数据库中的任何现有数据(theFeedType 是每个表的名称)

db=new DatabaseHelper(this);
db.setTableName(theFeedType);

dbCursor=db.getReadableDatabase().rawQuery("SELECT _ID, id, title FROM "+theFeedType+" ORDER BY id", null);

2/然后它通过实例化另一个类 HTTPRequestHelper 从提要 URL 加载新数据:

HTTPRequestHelper helper = new HTTPRequestHelper(responseHandler);
helper.performPost(theUrl, theFeedType);

HTTP 请求工作正常,并且根据单击两个按钮中的哪一个,两个不同的 Activity 中的每一个都显示适当的 XML(即检索正确的数据)- 因此我知道 theUrl 和 theFeedType 变量对于 TitlesBrowser 类的每个实例都是本地的。一个调用:

http://baroquedub.co.uk/get-feed.php?feed=news

and the other one:

http://baroquedub.co.uk/get-feed.php?feed=audio_mixes

The problem is with the DatabaseHelper class:

public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME="baroquedub.db";
private String table_name;


public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+ table_name + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"id INTEGER, " +
"title TEXT, " +
"details TEXT, " +
"picture TEXT, " +
"viewed BOOLEAN DEFAULT '0' NOT NULL);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
android.util.Log.w("Baroquedub", "Upgrading database, which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS mixtapes");
onCreate(db);
}

public void setTableName(String theName){
this.table_name = theName;
}
}

我希望它在每次实例化时创建一个新表(无论是从其父 TitlesBrowser 类传递“news”还是“audio_mixes”。

但它只工作一次 - 如果我启动应用程序并单击“新闻”,则会创建一个名为新闻的表,并且每次我返回该 Activity 时,它都会成功地从同一个数据库中检索数据。

但是,如果我随后通过单击另一个按钮(即访问另一个提要)来启动另一个 Activity ,我会收到一个 SQL 错误,告诉我该名称的数据库不存在。换句话说,onCreate db.execSQL("CREATE TABLE... 方法似乎没有被再次调用。

就好像没有创建 DatabaseHelper 类的多个副本,尽管有两个 TitlesBrowser 实例。

--这是问题的演示:

http://screencast.com/t/NDFkZDFmMz

这真的很难解释(尤其是对于新手!!!),我希望它能说得通。如果有任何帮助、建议或指导,我将不胜感激。

最佳答案

当您实例化一个 SQLiteOpenHelper 类时,您实际上是在 Activity 的上下文中访问一个单例。助手决定何时调用 OnCreate/onUpgrade 方法 - 具体来说,如果 DB 不存在或过时。

无论哪种方式,onCreate 方法都不会在您每次创建该类的新实例时调用 - 这真的没有意义。您应该将两个 CREATE TABLE 命令放在 onCreate 方法中。

(PS,我假设您得到的错误是缺少,而不是整个数据库)。

关于android - Android Activity 类中的面向对象范围和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com