Ссылка на пустой объект SharedPreferences в SQLiteAssetHelper - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь отсортировать свою базу данных SQliteDatabase с помощью функции sharedpreferences, когда я добавляю sharedpreference в свой класс базы данных, он показывает нулевую ссылку на объект, я не знаю, как решить эту проблему, может кто-нибудь помочь, пожалуйста?я разместил свой logcat также ниже, пожалуйста, проверьте.

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.preference.PreferenceManager;
import com.sample.quotes.QuoteActivity;
import com.sample.quotes.R;
import com.sample.quotes.datacon.QuoteData;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
import java.util.ArrayList;
import java.util.List;
import static android.content.Context.MODE_PRIVATE;

public class Database extends SQLiteAssetHelper{

public static final String DB_NAME="quote.db";
public static final int DB_VER=1;

PreferenceManager preferenceManager;

public Database(Context context) {
    super(context, DB_NAME, null, DB_VER);

}

public List<QuoteData> getQuotes()
{
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

    String[] sqlSelect={"Id","Details","Headings","Categories"};

    String tableName="TableOne";

    qb.setTables(tableName);

    SharedPreferences textColorPref = preferenceManager.getSharedPreferences();
    String checked = textColorPref.getString("quotesSort", "");

    if(checked.equals("")){
        Cursor cursor = qb.query(db,sqlSelect,null,null,null,null,checked);
        List<QuoteData> result = new ArrayList<>();
        if(cursor.moveToFirst())
        {
            do{
                QuoteData quotedata = new QuoteData();
                quotedata.setId(cursor.getInt(cursor.getColumnIndex("Id")));
                quotedata.setDetails(cursor.getString(cursor.getColumnIndex("Details")));
                quotedata.setHeadings(cursor.getString(cursor.getColumnIndex("Headings")));
                quotedata.setCategories(cursor.getString(cursor.getColumnIndex("Categories")));


                result.add(quotedata);
            }while (cursor.moveToNext());
        }
        return result;
    } else {
        Cursor cursor = qb.query(db,sqlSelect,null,null,null,null,null);
        List<QuoteData> result = new ArrayList<>();
        if(cursor.moveToFirst())
        {
            do{
                QuoteData quotedata = new QuoteData();
                quotedata.setId(cursor.getInt(cursor.getColumnIndex("Id")));
                quotedata.setDetails(cursor.getString(cursor.getColumnIndex("Details")));
                quotedata.setHeadings(cursor.getString(cursor.getColumnIndex("Headings")));
                quotedata.setCategories(cursor.getString(cursor.getColumnIndex("Categories")));
                result.add(quotedata);
            }while (cursor.moveToNext());
        }
        return result;
    }
}
public List<QuoteData> getQuotesByDetail(String details)
{
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

String[] sqlSelect={"Id","Details","Headings","Categories"};
String tableName="TableOne";

qb.setTables(tableName);
//  Cursor cursor = qb.query(db,sqlSelect,"Name = ?",new String[] 
{name},null,null,null);

Cursor cursor = qb.query(db,sqlSelect,"Details LIKE ?",new String[] 
{"%"+details+"%"},null,null,null);
List<QuoteData> result = new ArrayList<>();
if(cursor.moveToFirst())
{
    do{
        QuoteData quotedata = new QuoteData();
        quotedata.setId(cursor.getInt(cursor.getColumnIndex("Id")));
        quotedata.setDetails(cursor.getString(cursor.getColumnIndex("Details")));
        quotedata.setHeadings(cursor.getString(cursor.getColumnIndex("Headings")));
        quotedata.setCategories(cursor.getString(cursor.getColumnIndex("Categories")));

        result.add(quotedata);
    }while (cursor.moveToNext());
}
return result;
}
}

Stacktrace:

java.lang.RuntimeException: Unable to start activity ComponentInfo{QuoteActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.preference.PreferenceManager.getSharedPreferences()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2439)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2499)
        at android.app.ActivityThread.access$900(ActivityThread.java:166)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5468)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.preference.PreferenceManager.getSharedPreferences()' on a null object reference
        at com.sample.quotes.database.Database.getQuotes(Database.java:45)
        at com.sample.quotes.QuoteActivity.onCreate(QuoteActivity.java:81)
        at android.app.Activity.performCreate(Activity.java:6556)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2392)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2499) 
        at android.app.ActivityThread.access$900(ActivityThread.java:166) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5468) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

preferenceManager никогда не инициализируется, и, как правило, вы не хотите получать экземпляр SharedPreferences, если вы не в PreferenceFragment.

Вместо этого вы должны сделать sharedPreferences глобальной переменной и инициализировать еев вашем конструкторе:

private SharedPreferences sharedPreferences;

public Database(Context context) {
    super(context, DB_NAME, null, DB_VER);
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(); //or however you initialize the SharedPreferences you want elsewhere
}
0 голосов
/ 22 сентября 2018

Вы не инициализируете preferenceManager нигде в вашем коде, поэтому он дает исключение нулевого указателя в getQuotes()

...