Не могу получить соединение с базой данных, как я не могу передать контекст в DBManager - PullRequest
0 голосов
/ 01 марта 2019

У меня есть менеджер Dummy Data, который будет заполнять ArrayList содержимым базы данных SQLite.Когда я пытаюсь создать объект БД, я получаю сообщение об ошибке, в котором говорится, что 'com.example.listview.manager.ActivityDummyDataManager.this' нельзя ссылаться из статического контекста.

package com.example.listview.manager;

import android.database.Cursor;
import com.example.listview.DBManager;
import com.example.listview.model.ActivityItem;
import java.util.ArrayList;


public class ActivityDummyDataManager {


    public static ArrayList<ActivityItem> getActivityItemList() {
        DBManager db = new DBManager(this);
        Cursor cursor = db.fetch();
        ArrayList<com.example.listview.model.ActivityItem> list = new ArrayList<>();
        while (cursor.moveToNext()) {
            int index;
            index = cursor.getColumnIndexOrThrow("id");
            Long id = cursor.getLong(index);

            index = cursor.getColumnIndexOrThrow("activity");
            String activity = cursor.getString(index);

            index = cursor.getColumnIndexOrThrow("description");
            String description = cursor.getString(index);

            index = cursor.getColumnIndexOrThrow("description");
            String date = cursor.getString(index);
            ActivityItem item = new ActivityItem();
            item.setId(id);
            item.setActivity(activity);
            item.setDescription(description);
            item.setDate(date);
            list.add(item);
        }
        return list;
    }
}

У меня есть класс DBManager Iобычно получал бы доступ с использованием DBManager db = new DBManager (this), но по какой-то причине это не будет работать из этого класса.

package com.example.listview;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class DBManager {
    private DatabaseHelper dbHelper;
    private Context context;
    private SQLiteDatabase database;

    public DBManager(Context c) {
        context = c;
    }

    public DBManager open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {

        dbHelper.close();
    }

    public void insert(String activity, String description, String date) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(DatabaseHelper.ACTIVITY, activity);
        contentValue.put(DatabaseHelper.DESCRIPTION, description);
        contentValue.put(DatabaseHelper.DATE, date);
        database.insert(DatabaseHelper.TABLE_NAME, null, contentValue);
    }

    public Cursor fetch() {
        String[] columns = new String[] {
                DatabaseHelper._ID,
                DatabaseHelper.ACTIVITY,
                DatabaseHelper.DESCRIPTION,
                DatabaseHelper.DATE
        };
        Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, columns, null,
                null, null, null, "DATE DESC");
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public Cursor fetchForEdit(String id) {
        String[] columns = new String[] {
                DatabaseHelper._ID,
                DatabaseHelper.ACTIVITY,
                DatabaseHelper.DESCRIPTION,
                DatabaseHelper.DATE
        };

        String [] args = new String [] {id};
        Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, columns, "_ID=?",
              args, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        Log.d("DATABASE", "cursor= "+cursor.getColumnName(1));
        return cursor;
    }


    public int update(long _id, String activity, String description, String date) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.ACTIVITY, activity);
        contentValues.put(DatabaseHelper.DESCRIPTION, description);
        contentValues.put(DatabaseHelper.DATE, date);
        int i = database.update(
                DatabaseHelper.TABLE_NAME, contentValues,
                DatabaseHelper._ID + " = " + _id,
                null);
        return i;
    }

    public void delete(long _id) {
        database.delete(DatabaseHelper.TABLE_NAME,
                DatabaseHelper._ID + "=" + _id,
                null);
    }
}

Почему я не могу установить DBManager db = new DBManager (this);получить соединение с БД.Говорит, что на com.example.listview.manager.ActivityDummyDataManager.this нельзя ссылаться из статического контекста.Может ли кто-нибудь также объяснить аргумент контекста, поскольку я его не очень понимаю.

1 Ответ

0 голосов
/ 01 марта 2019

Ваш конструктор DBManager(Context c) ожидает контекст в качестве параметра. Если вы вызовете этот конструктор из класса Activity или Service, он будет работать, так как Activity и Service являются подклассами Context, поэтому достаточно передать this.Поскольку ActivityDummyDataManager не обрабатывает контекст, вам необходимо передать контекст либо из действия, либо вы можете передать контекст приложения getApplicationContext().

Измените свой метод, как показано ниже

public static ArrayList<ActivityItem> getActivityItemList() {
        DBManager db = new DBManager(mContext);
        //rest of your code.
}

и при его вызовеиспользуйте действие или контекст приложения в зависимости от того, что подходит.

...