0

I try to sort my SQliteDatabase using sharedpreferences fetch, when i add sharedpreference on my database class it shows null object reference, i don't know how to solve this, could anyone help please? i posted my logcat also below please check.

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) 
PPartisan
  • 8,173
  • 4
  • 29
  • 48

2 Answers2

0

You are not initializing preferenceManager anywhere in your code, thus it's giving a null pointer exception in getQuotes()

Basil
  • 845
  • 9
  • 24
0

preferenceManager is never initialized, and it's generally not how you want to get a SharedPreferences instance unless you're in a PreferenceFragment.

Instead, you should make sharedPreferences a global variable and initialize it in your constructor:

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
}
TheWanderer
  • 16,775
  • 6
  • 49
  • 63