我正在尝试通过http://developer.android.com/training/basics/data-storage/databases.html获取用于SQLite3数据库访问的Android教程示例。我陷入了我无法理解的错误消息中:
构造函数FeedReaderDbHelper(Context)引用丢失的类型
语境
我不明白为什么编译器会抱怨类型Context
丢失或如何解决该错误。该错误在第一个文件的mDbHelper = new FeedReaderDbHelper(c);
行上报告。这是源文件:
文件1:MainActivity.java
package com.example.sqlitetest;
import android.os.Bundle;
import android.database.sqlite.*;
import android.app.Activity;
import android.view.*;
import android.content.*;
public class MainActivity extends Activity {
FeedReaderDbHelper mDbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View v = findViewById(R.layout.activity_main);
Context c = v.getContext();
mDbHelper = new FeedReaderDbHelper(c);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
文件2:FeedReaderContract
package com.example.sqlitetest;
import android.provider.BaseColumns;
import android.database.sqlite.*;
import android.content.*;
public final class FeedReaderContract {
// To prevent someone from accidentally instantiating the contract class,
// give it an empty constructor.
public FeedReaderContract() {}
/* Inner class that defines the table contents */
public static abstract class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_ENTRY_ID = "entryid";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
// ...
}
private static final String TEXT_TYPE = " TEXT";
private static final String COMMA_SEP = ",";
private static final String SQL_CREATE_ENTRIES =
"CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
FeedEntry._ID + " INTEGER PRIMARY KEY," +
FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
// ... // Any other options for the CREATE command
" )";
private static final String SQL_DELETE_ENTRIES =
"DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;
public class FeedReaderDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database version.
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "FeedReader.db";
public FeedReaderDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_ENTRIES);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_ENTRIES);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
}
最佳答案
1.使用mDbHelper = new FeedReaderDbHelper(this); or mDbHelper = new FeedReaderDbHelper(getApplicationContext());
所以你的onCreate()
应该是
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDbHelper = new FeedReaderDbHelper(this);
}
2。
在主类而不是子类中使用
extends SQLiteOpenHelper
,因此更改为public class FeedReaderContract extends SQLiteOpenHelper
和
make constructor of FeedReaderContract
和than pass context to constructor of FeedReaderContract
以及所有其他c
ode/functionality of FeedReaderDbHelper move to FeedReaderContract