Java 在SQLite数据库android中存储数据
我一直在尝试使用Java 在SQLite数据库android中存储数据,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我一直在尝试使用SQLite数据库在Android应用程序中存储数据。数据库用于存储聊天应用程序的数据,还用于存储消息的各种状态,如发送、传递、读取等 我在Android中面临的问题是,查询运行时没有错误,但当我尝试使用下面的saveChatMessage函数插入值时,它总是返回rowID=1 数据库中没有抛出错误,但当我尝试调用getAllUnsentMessages时,它返回一个大小为0的ArrayList 我尝试过对在线数据库进行查询,但似乎一切都很好。我不知道为什么数据没有被存储 我的代
SQLite
数据库在Android应用程序中存储数据。数据库用于存储聊天应用程序的数据,还用于存储消息的各种状态,如发送、传递、读取等
我在Android中面临的问题是,查询运行时没有错误,但当我尝试使用下面的saveChatMessage
函数插入值时,它总是返回rowID=1
数据库中没有抛出错误,但当我尝试调用getAllUnsentMessages
时,它返回一个大小为0的ArrayList
我尝试过对在线数据库进行查询,但似乎一切都很好。我不知道为什么数据没有被存储
我的代码如下:
public class DatabaseManager extends SQLiteOpenHelper {
private SQLiteDatabase db;
private static final String DATABASE_NAME = "CHAT";
private static final int DATABASE_VERSION = 1;
private static final String DB_ATTRIBUTE_MESSAGE = "body";
private static final String DB_ATTRIBUTE_CLIENT_TS = "clientTS";
private static final String DB_ATTRIBUTE_DELIVERED_STATUS = "delivered";
private static final String DB_ATTRIBUTE_DEVICE_ID = "deviceID";
private static final String DB_ATTRIBUTE_FROM_ID = "fromID";
private static final String DB_ATTRIBUTE_MESSAGE_ID = "messageID";
private static final String DB_ATTRIBUTE_READ_STATUS = "readStatus";
private static final String DB_ATTRIBUTE_SENT_STATUS = "return_m";
private static final String DB_ATTRIBUTE_SERVER_TS = "serverTS";
private static final String DB_ATTRIBUTE_TO_ID = "toID";
private static final String DB_ATTRIBUTE_TOKEN = "token";
private static final String SQL_CREATE_ENTERIES = "CREATE TABLE IF NOT EXISTS " + DATABASE_NAME + " " +
"(" +
DB_ATTRIBUTE_MESSAGE + " TEXT, " + /*message*/
DB_ATTRIBUTE_CLIENT_TS +" TEXT, " + /*device Timestamp*/
DB_ATTRIBUTE_DELIVERED_STATUS + " TEXT, " + /*delivery status (-1 if Pending, 0 otherwise)*/
DB_ATTRIBUTE_DEVICE_ID + " TEXT, " + /*device ID*/
DB_ATTRIBUTE_FROM_ID + " TEXT, " + /*from ID (not necessarily Other Person)*/
DB_ATTRIBUTE_MESSAGE_ID + " TEXT, " + /*message ID i.e UUID (unique per message)*/
DB_ATTRIBUTE_READ_STATUS + " TEXT, " + /*read Status (-1 if Pending, 0 otherwise)*/
DB_ATTRIBUTE_SENT_STATUS + " TEXT, " + /*returned from Server*/
DB_ATTRIBUTE_SERVER_TS + " TEXT, " + /*server Timestamp*/
DB_ATTRIBUTE_TO_ID + " TEXT, " + /*to ID (not necessarily my ID)*/
DB_ATTRIBUTE_TOKEN + " TEXT" + /*token received from Server*/
");";
private final static DatabaseManager instance;
private static final SQLiteException DOWNGRAD_EXCEPTION = new SQLiteException(
"Database file was deleted");
static {
instance = new DatabaseManager();
instance.getDB();
}
public static DatabaseManager getInstance() {
return instance;
}
private DatabaseManager() {
super(MyApplication.getInstance(), DATABASE_NAME, null, DATABASE_VERSION);
}
/*@Override
public void onLoad() {
try {
getWritableDatabase(); // Force onCreate or onUpgrade
} catch (SQLiteException e) {
if (e == DOWNGRAD_EXCEPTION) {
// Downgrade occured
} else {
throw e;
}
}
}*/
public SQLiteDatabase getDB() {
//Perform this operation in a background thread, prefereably
if (db == null)
db = getInstance().getWritableDatabase();
return db;
}
@Override
public void onCreate(SQLiteDatabase db) {
if (db != null) {
db.execSQL(SQL_CREATE_ENTERIES);
Log.e("Create Query", SQL_CREATE_ENTERIES);
}
Log.e("Database Manager" , "DB Manager onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
//save Chat Messages from Me as well as those received from Others, for first time.
public void saveChatMsg(String msg, String myTS, String deliveredStatus, String fromID/*myID*/, String messageID,
String readStatus, String return_m, String serverTS, String toID, String token) {
if (db != null) {
// Chat Message,
// clientTS,
// deliveredStatus,
// deviceID,
// fromID,
// messageID,
// read,
// return_m,
// serverTS,
// toID,
// token
db.beginTransaction();
ContentValues values = new ContentValues();
values.put(DB_ATTRIBUTE_MESSAGE, msg);
values.put(DB_ATTRIBUTE_CLIENT_TS, myTS);
values.put(DB_ATTRIBUTE_DELIVERED_STATUS, deliveredStatus);
values.put(DB_ATTRIBUTE_DEVICE_ID, AppConstants.DEVICE_ID);
values.put(DB_ATTRIBUTE_FROM_ID, fromID);
values.put(DB_ATTRIBUTE_MESSAGE_ID, messageID);
values.put(DB_ATTRIBUTE_READ_STATUS, readStatus);
values.put(DB_ATTRIBUTE_SENT_STATUS, return_m);
values.put(DB_ATTRIBUTE_SERVER_TS, serverTS);
values.put(DB_ATTRIBUTE_TO_ID, toID);
values.put(DB_ATTRIBUTE_TOKEN, token);
// Inserting Row
long rowId = db.insert(DATABASE_NAME, null, values);
Log.e("RowID", rowId + "");
db.execSQL("INSERT INTO " + DATABASE_NAME + " VALUES (" +
"'" + msg + "', " +
"'" + myTS + "', " +
"'" + deliveredStatus + "', " +
"'" + AppConstants.DEVICE_ID + "', " +
"'" + fromID + "', " +
"'" + messageID + "'" + ", " +
"'" + readStatus + "', " +
"'" + return_m + "', " +
"'" + serverTS + "', " +
"'" + toID + "', " +
"'" + token + "'" +
");"
);
Log.e("Insert Query", "INSERT INTO " + DATABASE_NAME + " VALUES (" +
"'" + msg + "', " +
"'" + myTS + "', " +
"'" + deliveredStatus + "', " +
"'" + AppConstants.DEVICE_ID + "', " +
"'" + fromID + "', " +
"'" + messageID + "'" + ", " +
"'" + readStatus + "', " +
"'" + return_m + "', " +
"'" + serverTS + "', " +
"'" + toID + "', " +
"'" + token + "'" +
");");
if (db.inTransaction())
db.endTransaction();
} else {
Log.e("DatabaseManager", "DB is NULL");
}
}
public void updateChatStatus(String messageID, int deliveredStatus) {
//db.execSQL();
if (db != null) {
switch (deliveredStatus) {
case 0: //Sent message to server
db.beginTransaction();
db.execSQL("UPDATE " + DATABASE_NAME + " SET " + DB_ATTRIBUTE_SENT_STATUS + "='1' WHERE " + DB_ATTRIBUTE_MESSAGE_ID + "='" + messageID + "'");
if (db.inTransaction())
db.endTransaction();
break;
case 1: //Sent message to recepients device
db.beginTransaction();
db.execSQL("UPDATE " + DATABASE_NAME + " SET " + DB_ATTRIBUTE_SENT_STATUS + "='1', " + DB_ATTRIBUTE_DELIVERED_STATUS + "='1' " +
" WHERE " + DB_ATTRIBUTE_MESSAGE_ID + "='" + messageID + "'");
if (db.inTransaction())
db.endTransaction();
break;
case 2: //Recepient has read the message
db.beginTransaction();
db.execSQL("UPDATE " + DATABASE_NAME + " SET " + DB_ATTRIBUTE_SENT_STATUS + "='1', " + DB_ATTRIBUTE_DELIVERED_STATUS + "='1', " +
DB_ATTRIBUTE_READ_STATUS + "='1'" + " WHERE " + DB_ATTRIBUTE_MESSAGE_ID + "='" + messageID + "'");
if (db.inTransaction())
db.endTransaction();
break;
default:
Log.e("DatabaseManager", "Weird DeliveryStatus");
}
}
}
public List<MessagesModel> getMessages(String fromID, String toID) {
ArrayList<MessagesModel> messagesModel = new ArrayList<MessagesModel>();
Cursor cursor = db.rawQuery("SELECT * FROM " + DATABASE_NAME + " WHERE " + DB_ATTRIBUTE_FROM_ID + "='" + fromID + "'" +
" OR " + DB_ATTRIBUTE_TO_ID + "='" + fromID + "' AND " + DB_ATTRIBUTE_SENT_STATUS + "='-1' ORDER BY " + DB_ATTRIBUTE_CLIENT_TS, null);
// Chat Message,
// clientTS,
// deliveredStatus,
// deviceID,
// fromID,
// messageID,
// read,
// return_m,
// serverTS,
// toID,
// token
if (cursor == null) {
return null;
}
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
MessagesModel model = new MessagesModel();
model.setMessage(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_MESSAGE)));
model.setTs(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_CLIENT_TS)));
model.setMessageUUID(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_MESSAGE_ID)));
model.setBlueTick(true);
model.setCode("200"); //Code 401 is used to detect that it is a history item.
model.setUser_from(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_FROM_ID)));
model.setUser_to(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_TO_ID)));
model.setType(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_FROM_ID)).equals(fromID) ? 0: 1);
cursor.moveToNext();
messagesModel.add(model);
}
cursor.close();
return (List<MessagesModel>) messagesModel.clone();
}
public List<MessagesModel> getAllUnsentMessages() {
ArrayList<MessagesModel> allMessages = new ArrayList<MessagesModel>();
Cursor cursor = db.rawQuery("SELECT * FROM " + DATABASE_NAME + " WHERE " + DB_ATTRIBUTE_SENT_STATUS + "='-1'", null);
if (cursor == null)
return null;
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
MessagesModel model = new MessagesModel();
model.setMessage(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_MESSAGE)));
model.setTs(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_CLIENT_TS)));
model.setMessageUUID(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_MESSAGE_ID)));
model.setBlueTick(true);
model.setCode("200"); //Code 401 is used to detect that it is a history item. Set Code as per the status of the message
model.setUser_from(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_FROM_ID)));
model.setUser_to(cursor.getString(cursor.getColumnIndex(DB_ATTRIBUTE_TO_ID)));
cursor.moveToNext();
allMessages.add(model);
}
return allMessages;
}
public void execSQL(String query) {
if (db != null)
db.execSQL(query);
}
}
公共类数据库管理器扩展SQLiteOpenHelper{
专用数据库数据库;
私有静态最终字符串数据库\u NAME=“CHAT”;
私有静态最终int数据库_VERSION=1;
私有静态最终字符串DB_ATTRIBUTE_MESSAGE=“body”;
私有静态最终字符串DB\u属性\u CLIENT\u TS=“clientTS”;
私有静态最终字符串DB_属性_DELIVERED_STATUS=“DELIVERED”;
私有静态最终字符串DB\u ATTRIBUTE\u DEVICE\u ID=“deviceID”;
私有静态最终字符串DB_ATTRIBUTE_FROM_ID=“fromID”;
私有静态最终字符串DB\u属性\u MESSAGE\u ID=“messageID”;
私有静态最终字符串DB\u属性\u READ\u STATUS=“readStatus”;
私有静态最终字符串DB\u ATTRIBUTE\u SENT\u STATUS=“return\u m”;
私有静态最终字符串DB\u属性\u SERVER\u TS=“serverTS”;
私有静态最终字符串DB_ATTRIBUTE_TO_ID=“toID”;
私有静态最终字符串DB_ATTRIBUTE_TOKEN=“TOKEN”;
私有静态最终字符串SQL\u CREATE\u entries=“如果不存在创建表”+数据库\u NAME+“”+
"(" +
DB_属性_消息+“文本,”+/*消息*/
DB_属性_客户端_TS+“文本”+/*设备时间戳*/
DB_属性_已传递_状态+“文本,+/*传递状态(-1,如果挂起,则为0)*/
数据库属性设备ID+“文本”+/*设备ID*/
DB_属性_FROM_ID+“TEXT”,+/*FROM ID(不一定是其他人)*/
DB_属性_MESSAGE_ID+“TEXT”,+/*MESSAGE ID,即UUID(每条消息唯一)*/
DB_属性_READ_STATUS+“TEXT”,+/*读取状态(-1,如果挂起,则为0)*/
DB_属性_已发送_状态+“文本,”+/*从服务器返回*/
DB_属性_服务器_TS+“文本”+/*服务器时间戳*/
DB_属性_TO_ID+“TEXT”,+/*TO ID(不一定是我的ID)*/
DB_属性_令牌+“文本”+/*从服务器接收的令牌*/
");";
私有最终静态数据库管理器实例;
私有静态最终SQLiteException DOWNGRAD_EXCEPTION=新SQLiteException(
“数据库文件已删除”);
静止的{
实例=新数据库管理器();
getDB();
}
公共静态数据库管理器getInstance(){
返回实例;
}
专用数据库管理器(){
super(MyApplication.getInstance(),数据库\名称,null,数据库\版本);
}
/*@凌驾
public void onLoad(){
试一试{
getWritableDatabase();//Force onCreate或onUpgrade
}catch(sqlitee异常){
if(e==向下梯度_异常){
//发生降级
}否则{
投掷e;
}
}
}*/
公共SQLiteDatabase getDB(){
//最好在后台线程中执行此操作
if(db==null)
db=getInstance().getWritableDatabase();
返回分贝;
}
@凌驾
public void onCreate(SQLiteDatabase db){
如果(db!=null){
execSQL(SQL\u创建\u条目);
Log.e(“创建查询”,SQL\u创建\u输入);
}
Log.e(“数据库管理器”、“数据库管理器onCreate”);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
}
//第一次保存来自我和其他人的聊天信息。
public void saveChatMsg(字符串msg、字符串myTS、字符串deliveredStatus、字符串fromID/*myID*/、字符串messageID、,
字符串读取状态、字符串返回、字符串服务器、字符串toID、字符串令牌){
如果(db!=null){
//聊天信息,
//客户,
//交付状态,
//设备ID,
//弗洛伊德,
//messageID,
//读到,
//回程(m),
//服务器,
//托伊德,
//代币
db.beginTransaction();
ContentValues=新的ContentValues();
value.put(DB_属性_消息,msg);
value.put(DB\u属性\u客户端\u TS,myTS);
value.put(DB_属性_DELIVERED_状态,deliveredStatus);
value.put(DB\u属性\u设备\u ID,AppConstants.DEVICE\u ID);
value.put(DB_属性_FROM_ID,FROM ID);
value.put(数据库属性消息ID,消息ID);
value.put(数据库属性读取状态,读取状态);
value.put(数据库属性发送状态,返回m);
value.put(数据库属性服务器,服务器);
value.put(DB_属性_到_ID,toID);
value.put(DB_属性_令牌,令牌);
//插入行
long rowId=db.insert(数据库名称,null,值);
Log.e(“RowID”,RowID+”);
db.execSQL(“插入”+数据库名称+”值(“+
“““+msg+”,”+
“““+myTS+”,”+
““+deliveredStatus+”+
““+AppConstants.DEVICE_ID+”,”+
“““+fromID+”,”+
“““+messageID+”“+”,”+
““+readStatus+”,”+
“““+return_m+”,”+
““+serverTS+”,”+
““+toID+”,”+
“““+token+””+