- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常,在 Activity 中,我是这样使用SQLiteOpenHelper
DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContext());
现在,我想在服务中使用 SQLite。但是,当我在Service类的方法中使用上面的代码时,会导致NullPointerException错误。
这是我的服务类
public class MyService extends Service{
public void LoadDB(){
DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContext());
ArrayList <MyPosition> 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;
}
}
}
}
我的 DatabaseHandler 类
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 <MyPosition> getAllPositions() {
ArrayList <MyPosition> position_list = new ArrayList <MyPosition>();
// 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;
}
}
你对我有什么建议吗?谢谢大家。
最佳答案
您不应该将 getBaseContext()
用于您的上下文(在您的 Activity 中或在此服务中)。
Service extends (is a) Context
所以你可以像这样修复你的代码:
public class MyService extends Service{
public void LoadDB(){
DatabaseHandler mDbHelper = new DatabaseHandler(this);
}...
Here is a good place to start learning about Context
编辑:
您不应该使用 Service()
构造函数。您应该阅读 Service javadoc
要从 Activity 启动服务,您需要创建一个 Intent,然后调用 startService() 将其传入。
Intent i = new Intent(this, YourService.class);
startService(i);
关于android - 如何在服务中使用 SQLiteOpenHelper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18523725/
我是 Android 开发的新手(坦率地说是整体开发),因此我一直在阅读 Commonsware Busy Coder 的指南。在阅读 SQLite 部分时,有几件事对我来说不是 %100 清楚。以下
我正在尝试在 Sqlite 数据库 中添加当前位置的纬度和经度。但是当我打开我的 Activity 时,它会崩溃并显示 android.database.sqlite.SQLiteOpenHelper
我无法理解我是如何错误地初始化数据库的: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHel
我有两个 Activity 和多个数据库类,我想在从 Activity1 到 Activity2 时传递附加信息中的数据库类名称,并在 Activity2 中加载 DatabaseAdapter 类。
我正在为我的(初学者/Android)应用程序实现一个数据库。 我不清楚是否 SQLiteOpenHelper 旨在创建数据库(物理上,写入.db/.sql 文件) super() 或者如果仍然由我来
我正在做一些测试,每次我调用 SQLiteOpenHelper.close()然后我尝试重新打开数据库,例如 SQLiteOpenHelper.getWritableDatabase()我得到异常 j
新手Q来自iPhone/MonoTouch C#背景 我有一个来自另一个项目的现有 SQLite 数据库文件。 我在哪里将数据库文件包含到我的 Eclipse 项目中以使其与应用程序一起部署。 我需要
我正在研究 Android SDK,以期为 friend 编写一个简单的应用程序(并且可能用于销售)。 此应用程序将在数据库中搜索关键字并将结果显示在屏幕上,我已经查看了 searchabul 词典和
如果一个应用程序中的多个 Activity 调用我的 SQLiteOpenHelper 的构造函数并将它们自己作为上下文参数,我可以确定它们都将访问同一个数据库吗? 例如,假设我有: package
我不知道是什么锁定了我的数据库。这个应用程序在生产中是全新的,我什至无法执行第一个将用户添加到数据库的操作。我有一个 DatabaseHandler 可以执行所有数据库操作。我的 Activity 正
通常,在 Activity 中,我是这样使用SQLiteOpenHelper DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContex
我想用一些额外的方法(比如 getStreetsCursor)制作 SQLiteOpenHelper,这些方法从我的数据库返回数据。所以我写了这样的东西: public class DBHelper
我为学生创建了一个包含姓名、姓氏、分数字段的数据库,我确实成功地插入和查看了但我不知道如何进行更新和删除。 请在这里帮助我想根据ID进行更新和删除。 最佳答案 在 DatabaseHandler 类中
首先,我是 Android 应用程序的新手,并不是一个人在做这件事。我的队友在我处理这件事的同时进行了设计,并要求我设置数据库以及执行此操作的方法等等。 所以虽然大部分看起来没问题,但我说: Cont
为什么在 SQLiteOpenHelper 类变量的所有演示和教程中总是:public static final 看看: public static final String ORDER_ID
如果您扩展 SQLiteOpenHelper,您必须为构造函数使用上下文。我想知道是否有办法忽略它,并且能够在没有上下文的情况下使用数据库表。 或者至少是限制性的,我的意思是一种项目/类结构的方式,它
android.database.sqlite.SQLiteOpenHelper如果其构造函数的名称参数为 null,则提供使用内存数据库的能力: String: of the database fi
所以我想出了一些想法,我想知道它是否可以实现。 假设我有多个表(数据库模型),每个表都由某个类表示。我不习惯将单例模式与 open helper 一起使用,所以我创建了一些简单的类来提供数据库。我的想
我有一个即将发布的 Android 应用程序,我正在审查我的一些代码。我担心我的 SQLiteOpenHelper 的实现。具体来说,我想验证 onUpgrade 方法中的 oldVersion 和
我一直在使用 Android 和 SQLite 数据库开发应用程序。但我有一些问题。这是我的代码: SQLiteHelperMoney SQLiteHelperMoney1 = new
我是一名优秀的程序员,十分优秀!