我正在尝试通过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 FeedReaderContractthan pass context to constructor of FeedReaderContract

以及所有其他c ode/functionality of FeedReaderDbHelper move to FeedReaderContract

07-24 12:29