2014-11-05 124 views
0

我想在我的Android应用程序上创建数据库时收到此消息。我是新手与android sqlite数据库。现在我只是尝试创建自定义数据库管理器,并且在oncreate()函数中出现错误。Android,创建数据库错误(SQLITE)

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Crear tablas 
     sqlDB.execSQL(Cuenta.CREATE_TABLE); 

    } 

请问您能帮我吗?

11-05 12:21:01.468: E/AndroidRuntime(1064): FATAL EXCEPTION: main 
11-05 12:21:01.468: E/AndroidRuntime(1064): java.lang.RuntimeException: Unable to create  application com.example.database.BDApplication: java.lang.NullPointerException 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3451) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.ActivityThread.access$2200(ActivityThread.java:124) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1012) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.os.Looper.loop(Looper.java:130) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.ActivityThread.main(ActivityThread.java:3859) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at java.lang.reflect.Method.invoke(Method.java:507) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:890) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:648) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at dalvik.system.NativeStart.main(Native Method) 
11-05 12:21:01.468: E/AndroidRuntime(1064): Caused by: java.lang.NullPointerException 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at com.example.database.DBAdapter$DBOpenHelper.onCreate(DBAdapter.java:61) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:151) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at com.example.database.DBAdapter.open(DBAdapter.java:26) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at com.example.database.BDApplication.onCreate(BDApplication.java:20) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3448) 
11-05 12:21:01.468: E/AndroidRuntime(1064):  ... 10 more 

而且我的课

public class Cuenta { 
// Nombre de la tabla 
private final static String NAME = "cuenta"; 

// Objeto que utilizamos para acceder a la base de datos. 
private SQLiteDatabase sqlDB; 

/** 
* Constructor 
* 
* @param sqlDB 
*/ 
public Cuenta(SQLiteDatabase sqlDB) { 
    this.sqlDB = sqlDB; 
} 

/** 
* Clase que contiene los campos de la tabla. 
* 
* @author 
* 
*/ 
public class Columns implements BaseColumns { 
    public final static String NUM_CLIENTE = "num_cliente"; 
    public final static String RAZON_SOCIAL = "razon_social"; 
    public final static String NUM_SUCURSAL = "num_sucursal"; 
    public final static String DESC_SUCURSAL = "desc_sucursal"; 
} 

// Objeto en el que guardamos todos los nombres de los campos de la tabla 
// para utilizarlos posteriormente en algunos métodos. 
private final static String[] COLUMNS = {Columns.NUM_CLIENTE, Columns.RAZON_SOCIAL, 
     Columns.NUM_SUCURSAL, Columns.DESC_SUCURSAL}; 

// Sentencia para crear la tabla en la BD. 
public final static String CREATE_TABLE = "create table if not exists " 
     + NAME + "(" + Columns.NUM_CLIENTE + " integer not null, " 
     + Columns.RAZON_SOCIAL + " varchar(15) not null, " 
     + Columns.NUM_SUCURSAL + " integer not null, " 
     + Columns.DESC_SUCURSAL + " varchar(15) not null)"; 

} 

的将对DBAdapter类..

public class DBAdapter { 
    final static int VERSION = 1; 
    final static String DB_NAME = "Miscore"; 

    private DBOpenHelper dbHelper; 
    private SQLiteDatabase sqlDB; 

    // Declaramos las variables. 
    Cuenta cuenta; 


    public DBAdapter(Context context) { 
    dbHelper = new DBOpenHelper(context); 
    } 

    public void open() { 
    sqlDB = dbHelper.getWritableDatabase(); 
    cuenta = new Cuenta(sqlDB); 
} 

public void close() { 
    sqlDB.close(); 
} 

/** 
* Comprueba si la cuenta está vacía. 
* 
* @return true si está vacía. 
*/ 
public boolean cuentaIsEmpty() { 
    return cuenta.isEmpty(); 
} 

/** 
* Lee los nombres de Cuenta de la BD 
* 
* @return Cursor 
*/ 
public Cursor getNombresCuentaCursor() { 
    return cuenta.getNombres(); 
} 

private class DBOpenHelper extends SQLiteOpenHelper { 

    public DBOpenHelper(Context context) { 
     super(context, DB_NAME, null, VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Crear tablas 
     sqlDB.execSQL(Cuenta.CREATE_TABLE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 
} 
+0

需要看您将对DBAdapter $ DBOpenHelper类,因为这是那里的NPE发生。另外 - 什么是sqlDB?你不能只使用传入onCreate的数据库参数? – 2014-11-05 18:40:21

+0

嗨迈克尔,我刚刚添加了DBAdapter类 – user3285457 2014-11-05 18:48:27

回答

0

你DBOpenHelper阶级都有的onCreate调用时你打电话dbHelper.getWritableDatabase()。然而,在初始化之前onCreate引用sqlDB。

相反,我认为你应该使用传入的SQLiteDatabase数据库参数onCreate来创建你的表。

换句话说,替换此:

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Crear tablas 
    sqlDB.execSQL(Cuenta.CREATE_TABLE); 
} 

有了这个:

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Crear tablas 
    db.execSQL(Cuenta.CREATE_TABLE); 
} 
+0

非常感谢你,一周这个问题 – user3285457 2014-11-05 20:03:05

0

你需要初始化 “Cuenta()

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Crear tablas 
     sqlDB.execSQL(Cuenta.CREATE_TABLE); //Cuenta is Null! 

    }