问题描述
林尝试存储的方法中的特定列中的数据,并调用在另一个类的String []其中旋转器将访问该阵列为用户选择,然后将得到存储在另一个数据库显示的列行该方法。
即时得到nulpointerexception,当我尝试和open()数据库的数据库被锁定。对不起,听起来像一个完整的业余的,比较新到Android。预先感谢您的任何帮助。
这是我的code,当我在我的主类调用getInstance和getCPnames()
的String [] =停车场CarParkDb.getInstance()getCpnames()。
这是我的code数据库:
包com.example.parkangel;进口的java.util.ArrayList;
进口android.content.ContentValues;
进口android.content.Context;
进口android.database.Cursor;
进口android.database.SQLException;
进口android.database.sqlite.SQLiteDatabase;
进口android.database.sqlite.SQLiteOpenHelper;公共类CarParkDb {
公共静态最后弦乐KEY_ID =_id;
公共静态最后弦乐KEY_CPNAME =CPNAME;
公共静态最后弦乐KEY_COST =成本;
私有静态最后弦乐DATABASE_NAME =CPDB;
私有静态最后弦乐DATABASE_TABLE =CPTable;
私有静态最终诠释DATABASE_VERSION = 1; 私人CPDbHelper cpdbHelper; 私人语境ourContext;
私人SQLiteDatabase ourDatabase;
私有静态CarParkDb实例;
私有静态类CPDbHelper扩展SQLiteOpenHelper { 公共CPDbHelper(上下文的背景下){
超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
// TODO自动生成构造函数存根
}@覆盖
公共无效的onCreate(SQLiteDatabase DB){
// TODO自动生成方法存根
db.execSQL(CREATE TABLE+ DATABASE_TABLE +(+
KEY_ID +INTEGER PRIMARY KEY AUTOINCREMENT,+
KEY_CPNAME +TEXT NOT NULL,+ KEY_COST +TEXTNOT NULL);); db.execSQL(插入+ DATABASE_TABLE +VALUES('1','LearningResource中心','2'););
db.execSQL(插入+ DATABASE_TABLE +的值('2','ParkandRide','1'););
db.execSQL(插入+ DATABASE_TABLE +VALUES('3','德哈维兰校园','2'););
db.execSQL(插入+ DATABASE_TABLE +值(4,多层建筑物','2'););
db.execSQL(插入+ DATABASE_TABLE +VALUES('5','接待','2');); } 公共无效的OnOpen(最终SQLiteDatabase DB){
super.onOpen(DB);
} @覆盖
公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
// TODO自动生成方法存根 db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE);
的onCreate(DB);
}
} 公共CarParkDb(最终上下文C)
{
this.cpdbHelper =新CPDbHelper(C);
establishDb();
// ourContext = C;
}
公共无效establishDb()
{
如果(this.ourDatabase == NULL)
{
this.ourDatabase = this.cpdbHelper.getWritableDatabase();
} } 公共CarParkDb(){
// TODO自动生成构造函数存根
}
公共CarParkDb的open()抛出的SQLException
{
的System.out.println(开跑);
cpdbHelper =新CPDbHelper(ourContext);
ourDatabase = cpdbHelper.getWritableDatabase();
返回此;
} 公共无效的close()
{
ourDatabase.close();
} / *众长createEntry(字符串CPNAME,字符串费用){
ContentValues CV =新ContentValues();
cv.put(KEY_CPNAME,CPNAME);
cv.put(KEY_COST,成本);
返回ourDatabase.insert(DATABASE_TABLE,空,CV);
} * / 公共字符串的getData(){
// TODO自动生成方法存根
//打开();
的String [] =列新的String [] {KEY_ID,KEY_CPNAME,KEY_COST};
光标C = ourDatabase.query(DATABASE_TABLE,列,NULL,NULL,NULL,NULL,NULL);
字符串结果=; INT iRow = c.getColumnIndexOrThrow(KEY_ID);
INT iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
INT iCost = c.getColumnIndexOrThrow(KEY_COST); 为(c.moveToFirst();!c.isAfterLast(); c.moveToNext()){
结果=结果+ c.getString(iRow)++ c.getString(iCpname)++ c.getString(iCost)++\\ n;
c.close();
ourDatabase.close();
}
返回结果;
} 公共静态CarParkDb的getInstance()
{
同步(CarParkDb.class)
{
如果(例如== NULL)
{
例如=新CarParkDb();
}
返回实例;
}
} 公众的String [] getCpnames()
{
//打开();
如果(ourDatabase == NULL)的System.out.println(为空);
光标C = NULL; ArrayList的<串GT;名单=新的ArrayList<串GT;();
ourDatabase = cpdbHelper.getReadableDatabase();
// SQLiteDatabase分贝= cpdbHelper.getReadableDatabase();
查询字符串=SELECT+ KEY_CPNAME +FROM+ DATABASE_TABLE; {
C = this.ourDatabase.rawQuery(查询,NULL);
INT iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
如果(c.moveToFirst())
{
做
{
list.add(c.getString(iCpname));;
}
而(c.moveToNext());
}
如果(C =空&安培;!&安培;!c.isClosed())
{
c.close();
ourDatabase.close();
}
返回list.toArray(新的String [] {});
}
}}** ** LogCat中 一月3日至12日:32:39.759:E / AndroidRuntime(4176):因:显示java.lang.NullPointerException
一月3日至12日:32:39.759:E / AndroidRuntime(4176): 在com.example.parkangel.CarParkDb.getCpnames(CarParkDb.java:191)
一月3日至12日:32:39.759:E / AndroidRuntime(4176): 在com.example.parkangel.BookTicket<&初始化GT;(BookTicket.java:22)
一月3日至12日:32:39.759:E / AndroidRuntime(4176): 在java.lang.Class.newInstanceImpl(本机方法)
一月3日至12日:32:39.759:E / AndroidRuntime(4176): 在java.lang.Class.newInstance(Class.java:1208)
尝试更新的getInstance()
code这一点:
公共静态CarParkDb的getInstance(上下文C)//< - 添加上下文参数
{
同步(CarParkDb.class)
{
如果(例如== NULL)
{
例如=新CarParkDb(C); //< - 在构造函数中使用的上下文
}
返回实例;
}
}
这个问题似乎是,你使用一个构造函数(用于 CarParkDb
),什么也不做。你有另一个构造函数一个上下文
作为参数并初始化一些你以后使用的对象。
Im trying to store a particular columns data in a method and call that method in another classes String [] where a spinner will access that array to display the columns rows for the user to select which will then get stored in another database.
Im getting nulpointerexception and when I try and open() the database the database gets locked. Sorry for sounding like a complete amateur, relatively new to android. Thank you in advance for any help.
Here is my code when I call getInstance() and getCPnames() in my main class
String[] carParks = CarParkDb.getInstance().getCpnames();
Here is my code for the database:
package com.example.parkangel;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class CarParkDb {
public static final String KEY_ID = "_id";
public static final String KEY_CPNAME = "cpname";
public static final String KEY_COST = "cost";
private static final String DATABASE_NAME = "CPDB";
private static final String DATABASE_TABLE = "CPTable";
private static final int DATABASE_VERSION = 1;
private CPDbHelper cpdbHelper;
private Context ourContext;
private SQLiteDatabase ourDatabase;
private static CarParkDb instance;
private static class CPDbHelper extends SQLiteOpenHelper{
public CPDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_CPNAME + " TEXT NOT NULL, " + KEY_COST + " TEXTNOT NULL);");
db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('1','LearningResource Center','2');");
db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('2','ParkandRide','1');");
db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values ('3','deHavilland Campus','2');");
db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('4','MultiStorey Building','2');");
db.execSQL("INSERT INTO " + DATABASE_TABLE + " Values('5','Reception','2');");
}
public void onOpen(final SQLiteDatabase db) {
super.onOpen(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
public CarParkDb (final Context c)
{
this.cpdbHelper= new CPDbHelper(c);
establishDb();
//ourContext = c;
}
public void establishDb()
{
if (this.ourDatabase == null)
{
this.ourDatabase = this.cpdbHelper.getWritableDatabase();
}
}
public CarParkDb() {
// TODO Auto-generated constructor stub
}
public CarParkDb open() throws SQLException
{
System.out.println ("running open");
cpdbHelper = new CPDbHelper(ourContext);
ourDatabase = cpdbHelper.getWritableDatabase();
return this;
}
public void close()
{
ourDatabase.close();
}
/*public long createEntry(String cpname, String cost){
ContentValues cv = new ContentValues();
cv.put(KEY_CPNAME, cpname);
cv.put(KEY_COST, cost);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}*/
public String getData() {
// TODO Auto-generated method stub
//open();
String[] columns = new String[] {KEY_ID, KEY_CPNAME, KEY_COST};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null,null,null, null, null);
String result = " ";
int iRow = c.getColumnIndexOrThrow(KEY_ID);
int iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
int iCost = c.getColumnIndexOrThrow(KEY_COST);
for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + c.getString(iRow) + " " +c.getString(iCpname) + " " + c.getString(iCost) + " " + "\n";
c.close();
ourDatabase.close();
}
return result;
}
public static CarParkDb getInstance()
{
synchronized(CarParkDb.class)
{
if (instance == null)
{
instance = new CarParkDb();
}
return instance;
}
}
public String[] getCpnames()
{
//open();
if (ourDatabase == null) System.out.println ("is null");
Cursor c = null;
ArrayList<String> list = new ArrayList<String>();
ourDatabase = cpdbHelper.getReadableDatabase();
//SQLiteDatabase db = cpdbHelper.getReadableDatabase();
String query = "SELECT " + KEY_CPNAME + " FROM " + DATABASE_TABLE;
{
c = this.ourDatabase.rawQuery(query, null);
int iCpname = c.getColumnIndexOrThrow(KEY_CPNAME);
if (c.moveToFirst())
{
do
{
list.add(c.getString(iCpname));;
}
while (c.moveToNext());
}
if (c != null && !c.isClosed())
{
c.close();
ourDatabase.close();
}
return list.toArray(new String[]{});
}
}
}
**LogCat**
03-12 01:32:39.759: E/AndroidRuntime(4176): Caused by:java.lang.NullPointerException
03-12 01:32:39.759: E/AndroidRuntime(4176):
at com.example.parkangel.CarParkDb.getCpnames(CarParkDb.java:191)
03-12 01:32:39.759: E/AndroidRuntime(4176):
at com.example.parkangel.BookTicket.<init>(BookTicket.java:22)
03-12 01:32:39.759: E/AndroidRuntime(4176):
at java.lang.Class.newInstanceImpl(Native Method)
03-12 01:32:39.759: E/AndroidRuntime(4176):
at java.lang.Class.newInstance(Class.java:1208)
Try updating your getInstance()
code with this:
public static CarParkDb getInstance(Context c) // <-- added context as parameter
{
synchronized(CarParkDb.class)
{
if (instance == null)
{
instance = new CarParkDb(c); // <-- used context in constructor
}
return instance;
}
}
The problem seems to be that you're using a constructor (for CarParkDb
) that does nothing. You have another constructor that takes a Context
as parameter and initializes some of the objects that you're using later.
这篇关于Android的NullPointerException异常和GetDatabaseLocked的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!