Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to use SQLiteOpenHelper in Service
    primarykey
    data
    text
    <p>Normally, in the activity, I use SQLiteOpenHelper like this</p> <pre><code>DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContext()); </code></pre> <p>Now, I want to use SQLite in service. However, when I use the above code in the method of the Service class, it causes <strong>NullPointerException</strong> error.</p> <p>This is my Service class</p> <pre><code> public class MyService extends Service{ public void LoadDB(){ DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContext()); ArrayList &lt;MyPosition&gt; positionlist = mDbHelper.getAllPositions(); **//error here** } private final IBinder mBinder = new LocalBinder(); public class LocalBinder extends Binder { MyService getService() { // Return this instance of LocalService so clients can call public methods return MyService.this; } } @Override public IBinder onBind(Intent intent) { return mBinder; } } This is the code that I call Service in MainActivity class public class MainActivity extends Activity { MyService mService; boolean mBound = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity = this; mService = new MyService(); doBindService(); if (mBound){ mService.LoadDB(); } } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } }; void doBindService() { bindService(new Intent(MainActivity.this, MyService.class), mConnection, Context.BIND_AUTO_CREATE); mBound = true; } void doUnbindService() { if (mBound) { // Detach our existing connection. unbindService(mConnection); mBound = false; } } } } </code></pre> <p>My DatabaseHandler class</p> <pre><code>package com.example.example10; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class DatabaseHandler extends SQLiteOpenHelper{ // All Static variables // Database Version private static final int DATABASE_VERSION = 1; // Database Name private static final String DATABASE_NAME = "ListPosition"; // Position table name private static final String TABLE_POSITIONS = "positions"; // Position Table Columns names public static final String KEY_ROWID = "_id"; private static final String KEY_ADDRESS = "address"; private static final String KEY_LONG = "longPos"; private static final String KEY_LAT = "latPos"; private static final String KEY_LASTVISITED = "lastVisited"; private static final String KEY_IMAGE = "image"; public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // Creating Tables @Override public void onCreate(SQLiteDatabase db) { String CREATE_POSITIONS_TABLE = "CREATE TABLE " + TABLE_POSITIONS + "(" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_ADDRESS + " TEXT," + KEY_LONG + " REAL, " + KEY_LAT + " REAL, " + KEY_LASTVISITED + " TEXT, " + KEY_IMAGE + " BLOB" +")"; db.execSQL(CREATE_POSITIONS_TABLE); } // Upgrading database @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Drop older table if existed db.execSQL("DROP TABLE IF EXISTS " + TABLE_POSITIONS); // Create tables again onCreate(db); } /** * All CRUD(Create, Read, Update, Delete) Operations */ // Adding new position void addPosition(MyPosition position) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_ADDRESS, position.GetAddress()); values.put(KEY_LONG, position.GetLongPos()); values.put(KEY_LAT, position.GetLatPos()); values.put(KEY_LASTVISITED, position.GetLastVisited()); ByteArrayOutputStream stream = new ByteArrayOutputStream(); position.GetImage().compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] imageInByte = stream.toByteArray(); values.put(KEY_IMAGE, imageInByte); // Inserting Row db.insert(TABLE_POSITIONS, null, values); db.close(); // Closing database connection } // Getting All Positions public ArrayList &lt;MyPosition&gt; getAllPositions() { ArrayList &lt;MyPosition&gt; position_list = new ArrayList &lt;MyPosition&gt;(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_POSITIONS; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { MyPosition position = new MyPosition(); position.SetAddress(cursor.getString(1)); position.SetLongPos(cursor.getFloat(2)); position.SetLatPos(cursor.getFloat(3)); position.SetLastVisited(cursor.getString(4)); byte[] imagebyte = cursor.getBlob(5); Bitmap image = BitmapFactory.decodeByteArray(imagebyte, 0, imagebyte.length); position.SetImage(image); // Adding position to list position_list.add(position); } while (cursor.moveToNext()); } // return position list return position_list; } // Updating single position public int updatePosition(MyPosition position, int index) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_ADDRESS, position.GetAddress()); values.put(KEY_LONG, position.GetLongPos()); values.put(KEY_LAT, position.GetLatPos()); values.put(KEY_LASTVISITED, position.GetLastVisited()); ByteArrayOutputStream stream = new ByteArrayOutputStream(); position.GetImage().compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] imageInByte = stream.toByteArray(); values.put(KEY_IMAGE, imageInByte); // updating row return db.update(TABLE_POSITIONS, values, KEY_ROWID + "=" + (index + 1), null); } // Deleting single position public void deletePosition(MyPosition position, int index) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_POSITIONS, KEY_ROWID + "=" + (index + 1), null); db.close(); } // Getting position Count public int getPositionCount() { String countQuery = "SELECT * FROM " + TABLE_POSITIONS; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); int count = cursor.getCount(); cursor.close(); // return count return count; } // Getting single position MyPosition getPosition(int index) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_POSITIONS, new String[] { KEY_ADDRESS, KEY_LONG, KEY_LAT, KEY_LASTVISITED, KEY_IMAGE}, KEY_ROWID + "=?", new String[] { String.valueOf(index) }, null, null, null, null); if (cursor != null) cursor.moveToFirst(); Bitmap image = BitmapFactory.decodeByteArray(cursor.getBlob(5), 0, cursor.getBlob(5).length); MyPosition position = new MyPosition(cursor.getString(1), cursor.getDouble(2), cursor.getDouble(3), cursor.getString(4), image); // return contact return position; } } </code></pre> <p>Do you have any suggestion for me? Thanks all.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload