getContext() 无法在 SQLite dB 中解析

Posted

技术标签:

【中文标题】getContext() 无法在 SQLite dB 中解析【英文标题】:getContext() cannot be resolved in SQLite dB 【发布时间】:2015-07-05 11:02:06 【问题描述】:

我正在尝试创建一个 SQL 数据库来存储本地联系人信息(主要是电话号码(稍后验证)和显示名称,以及用户指定的布尔值。我创建了一个新的 contactdb 类,但是我在尝试使用 getcontext() 时遇到了一些问题。put 的次要值也无法解析。有人对如何解决这个问题有任何提示吗?我是否需要为 Dbhelper 创建一个新的类文件? 或者该位是否打算在 mainactivity 类中实例化,我希望在其中读取/写入信息到 DB?

package treehouse.greenlight;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.provider.BaseColumns;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.*;
import android.os.Bundle;
import android.content.ContentValues;
import android.view.View;

public final class contactdb 
// To prevent someone from accidentally instantiating the contract class,
// give it an empty constructor.
public contactdb() 


/* Inner class that defines the table contents */
public static abstract class dbEntry implements BaseColumns 
    public static final String TABLE_NAME = "Contacts";
    public static final String COLUMN_NAME_ENTRY_ID = "entryid";
    public static final Boolean COLUMN_NAME_STATUS = false;
    public static final String COLUMN_NAME_PHONE = "0000000000";
    public static final String COLUMN_NAME_NAME = "N/A";
    private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ",";
    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + dbEntry.TABLE_NAME + " (" +
                    dbEntry._ID + " INTEGER PRIMARY KEY," +
                    dbEntry.COLUMN_NAME_STATUS + TEXT_TYPE + COMMA_SEP +
                    dbEntry.COLUMN_NAME_NAME + TEXT_TYPE + COMMA_SEP +
                    dbEntry.COLUMN_NAME_PHONE + TEXT_TYPE + COMMA_SEP +// Any other options for the CREATE command
                    " )";

    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + dbEntry.TABLE_NAME;


    public class DbHelper extends SQLiteOpenHelper 
        DbHelper mDbHelper = new DbHelper(getContext());
        // 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 DbHelper(Context context) 
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        
        public void onCreate(SQLiteDatabase db) 
            db.execSQL(SQL_CREATE_ENTRIES);


            // Gets the data repository in write mode
            db = mDbHelper.getWritableDatabase();

            // Create a new map of values, where column names are the keys
            ContentValues values = new ContentValues();
            values.put(dbEntry.COLUMN_NAME_ENTRY_ID, id);
            values.put(dbEntry.COLUMN_NAME_STATUS, status);
            values.put(dbEntry.COLUMN_NAME_PHONE, content);

            // Insert the new row, returning the primary key value of the new row
            long newRowId;
            newRowId = db.insert(
                    dbEntry.TABLE_NAME,
                    dbEntry.COLUMN_NAME_NULLABLE,
                    values);
        

        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】:

你的数据库不是从Activity扩展的,所以这个方法是不可达的。 您应该创建从Activity 接收Context 作为参数的构造函数。你的代码应该是这样的:

private Context ctx;

public contactdb(Context ctx) 
    this.ctx = ctx;

在你的Activity 中你应该像这样创建实例:

contactdb db = new contactdb(this);

请用大写字母命名您的课程。研究一下java中的代码约定。

【讨论】:

Activity中也没有getContext,Activity就是Context。它存在于 Views 和其他一些类中。 Activity 是从 Context 扩展而来的,它调用向下转换,所以 this 表示在 Activity 上下文本身中。无论如何,问题是关于如何解决问题,而不是关于理论,但这是我的错字,我同意。谢谢。 感谢各位的澄清——我认为这是有道理的。所以我应该在我的 ContactDb 类中创建构造函数(并设置 ContactDb 扩展 Home_screen)。从那里,我可以在 Home_screen 活动本身中调用它,方法是用新的数据库 this 引用实例化它? @Shyam, Home_screen 是你的Activity 吗?是的,不,你不应该那样做。只需将Context 作为参数添加到您的构造函数中,并在您创建数据库实例并传递this 时添加到Activity 中。还有内部类DBHelper 使private 更有意义。 非常感谢 Yurets 的帮助。这是有道理的,我想我已经解决了大部分错误。【参考方案2】:

SQLiteOpenHelper 不存在 getContext。一个 Context 被传递到构造函数中。等到那时创建需要它的变量。

此外,您编写的代码会崩溃——它会创建一个实例化新 DBHelper 对象的无限循环。将 Foo name = new Foo() 放在 Foo 对象中总是会崩溃。

【讨论】:

嗨,Gabe,非常感谢您的提醒!我已将 DBhelper 移到对象之外。我究竟什么时候会创建这个构造函数?在实际的数据库类文件中还是在我想访问 db、put、drop 等的 Activity 中?

以上是关于getContext() 无法在 SQLite dB 中解析的主要内容,如果未能解决你的问题,请参考以下文章

无法解析“myAdapter”中的方法“getContext”[重复]

未捕获的类型错误:无法读取 null 的属性“getContext”

Android SQLite 更新无法在 AsyncTask 的后台运行

Canvas中用jQuery获取到的对象无法使用getContext

无法在 Sqlite3 Python Django 中的数据库中插入特定数据

Enmap 无法安装,出现 better-sqlite3 错误