【发布时间】:2023-03-08 10:35:02
【问题描述】:
我是 Android 和 SQLite 的新手。我正在尝试在我的数据库中创建多个表,首先,我将电子邮件详细信息保存在数据库中,然后通过该保存的电子邮件,我能够从服务器检索电子邮件。当我尝试将该电子邮件数据保存到第二个数据库表时,它会引发空指针异常。这是因为Sqlitedatabase db = this.writeabledatabase; 语句总是变为空,这意味着数据库无法获取路径。这是我的代码:
package com.elevenvalues.baig.db2listviewupdatedeleteinsert;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.sql.SQLException;
public class DbHelper extends SQLiteOpenHelper {
// table name
public static final String EMAIL_INSERT_TABLE = "EmailInsertDetail";
public static final String EMAIL_LOG = "EmailLog";
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
public static String DATABASE_NAME = "My database";
public static final String KEY_USERNAME = "username";
public static final String KEY_EMAIL = "email";
public static final String KEY_PASSWORD = "password";
public static final String KEY_SERVER = "server";
public static final String KEY_PORT = "port";
public static final String KEY_SECURITY_TYPE = "securityType";
public static final String KEY_ACTIVE_TIME = "activeTime";
public static final String KEY_ID = "id";
public static final String KEY_ROWID = "id";
public static final String KEY_FROM = "froom";
public static final String KEY_TO = "too";
public static final String KEY_MESSAGE_BODY = "messagebody";
SQLiteDatabase db;
private boolean isUpdate;
String id;
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE " + EMAIL_INSERT_TABLE + " (" + KEY_ID + " INTEGER PRIMARY KEY, "
+ KEY_USERNAME + " TEXT, " + KEY_EMAIL + " TEXT," + KEY_PASSWORD + " TEXT," + KEY_SERVER + " TEXT," +
KEY_PORT + " TEXT," + KEY_SECURITY_TYPE + " TEXT," + KEY_ACTIVE_TIME + " TEXT);";
String CREATE_SERVER_DATABASE = "CREATE TABLE " + EMAIL_LOG + " (" + KEY_ROWID + " INTEGER PRIMARY KEY, "
+ KEY_TO + " TEXT, " + KEY_FROM + " TEXT," + KEY_MESSAGE_BODY + " TEXT);";
db.execSQL(CREATE_SERVER_DATABASE);
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + EMAIL_INSERT_TABLE);
db.execSQL("DROP TABLE IF EXISTS " + EMAIL_LOG);
// create new tables
onCreate(db);
}
void EmailReadDataInsert(String from, String too, String messageBody) {
db=this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DbHelper.KEY_FROM, from);
cv.put(DbHelper.KEY_TO, too);
cv.put(DbHelper.KEY_MESSAGE_BODY, messageBody);
// Inserting Row
db.insert(EMAIL_LOG, null, cv);
}
/**
* save data into SQLite
*/
public void AddEmailData(String username,String email,String password,String server,String port,String securityType,
String activeTime) {
db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(DbHelper.KEY_USERNAME, username);
values.put(DbHelper.KEY_EMAIL, email);
values.put(DbHelper.KEY_PASSWORD, password);
values.put(DbHelper.KEY_SERVER, server);
values.put(DbHelper.KEY_PORT, port);
values.put(DbHelper.KEY_SECURITY_TYPE, securityType);
values.put(DbHelper.KEY_ACTIVE_TIME, activeTime);
if (isUpdate) {
//update database with new data
db.update(DbHelper.EMAIL_INSERT_TABLE, values, DbHelper.KEY_ID + "=" + id, null);
} else {
//insert data into database
db.insert(DbHelper.EMAIL_INSERT_TABLE, null, values);
}
//close database
db.close();
}
//---opens the database---
public DbHelper open() throws SQLException
{
db = this.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
this.close();
}
}
此方法中出现db 变为空的问题:
void EmailReadDataInsert(String from, String too, String messageBody) {
db=this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DbHelper.KEY_FROM, from);
cv.put(DbHelper.KEY_TO, too);
cv.put(DbHelper.KEY_MESSAGE_BODY, messageBody);
// Inserting Row
db.insert(EMAIL_LOG, null, cv);
}
如何解决我的问题?有什么建议吗?
【问题讨论】:
-
尝试摆脱这条线:db.close();