Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SQLite数据库android中存储数据_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

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+””+