如何像 Android 中的 whatsapp 一样在运行时将聊天记录存储在 Sqlite 中?
How to store chat history in Sqlite at runtime like whatsapp in Android?
我创建了一个简单的聊天应用程序,现在我想将聊天消息存储在 Sqlite 中以向用户提供聊天记录。但我不知道如何创建数据库和表,以及如何在运行时插入数据。
我想暂时存储 _sender、_receiver 和 _msg。我尝试了 this post 的答案,但
中存在语法错误
this.insertStmt = this.myDataBase.compileStatement(INSERT);
我什至不知道这是否适合我的情况,因为在聊天记录中,数据库似乎有点复杂。
我试过这个代码:
public void createDynamicDatabase(Context context, String tableName, ArrayList<String> title)
{
Log.i("INSIDE createLoginDatabase() Method","*************creatLoginDatabase*********");
try
{
int i;
String queryString;
// Opens database in writable mode.
myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);
//System.out.println("Table Name : "+tableName.get(0));
queryString = title.get(0)+" VARCHAR(30),";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1;i < title.size() - 1; i++)
{
queryString += title.get(i);
queryString +=" VARCHAR(30)";
queryString +=",";
}
queryString+= title.get(i) +" VARCHAR(30)";
queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "("+queryString+");";
System.out.println("Create Table Stmt : "+ queryString);
myDataBase.execSQL(queryString);
}
catch (SQLException ex)
{
Log.i("CreateDB Exception ",ex.getMessage());
}
}
public void insert(Context context, ArrayList<String> array_vals, ArrayList<String> title, String TABLE_NAME)
{
Log.d("Inside Insert","Insertion starts for table name: "+TABLE_NAME);
// Opens database in writable mode.
myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);
String titleString = null;
String markString = null;
int i;
titleString = title.get(0)+",";
markString = "?,";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1;i < title.size() - 1; i++)
{
titleString += title.get(i);
titleString +=",";
markString += "?,";
}
titleString+= title.get(i);
markString += "?";
//System.out.println("Title String: "+titleString);
//System.out.println("Mark String: "+markString);
INSERT="insert into "+ TABLE_NAME + "("+titleString+")"+ "values" +"("+markString+")";
System.out.println("Insert statement: "+INSERT);
//System.out.println("Array size iiiiii::: "+array_vals.size());
//this.insertStmt = this.myDataBase.compileStatement(INSERT);
int s=0;
while(s<array_vals.size())
{
System.out.println("Size of array1"+array_vals.size());
//System.out.println("Size of array"+title.size());
int j=1;
this.insertStmt = this.myDataBase.compileStatement(INSERT);
for(int k =0;k< title.size();k++)
{
//System.out.println("Value of column "+title+" is "+array_vals.get(k+s));
//System.out.println("PRINT S:"+array_vals.get(k+s));
System.out.println("BindString: insertStmt.bindString("+j+","+ array_vals.get(k+s)+")");
insertStmt.bindString(j, array_vals.get(k+s));
j++;
}
s+=title.size();
}
insertStmt.executeInsert();
}
我在 onCreate()
中创建了数据库,然后在用户发送消息时插入数据,然后 receives.but 收到此错误。;
android.database.sqlite.SQLiteException: near "08104710280": syntax error (code 1): , while compiling: insert into 08104710280(sender,receiver,msg)values(?,?,?)
在这一行
this.insertStmt = this.myDataBase.compileStatement(INSERT);
查看 SQLiteOpenHelper:
http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
编码示例:
在 android 中首选且更简单的方法是使用 Room library, which greatly reduces boilerplate and works smoothly with other architechture components like LiveData,为您处理后台查询并提供编译时检查,仅需几行代码。
我创建了一个简单的聊天应用程序,现在我想将聊天消息存储在 Sqlite 中以向用户提供聊天记录。但我不知道如何创建数据库和表,以及如何在运行时插入数据。
我想暂时存储 _sender、_receiver 和 _msg。我尝试了 this post 的答案,但
中存在语法错误this.insertStmt = this.myDataBase.compileStatement(INSERT);
我什至不知道这是否适合我的情况,因为在聊天记录中,数据库似乎有点复杂。
我试过这个代码:
public void createDynamicDatabase(Context context, String tableName, ArrayList<String> title)
{
Log.i("INSIDE createLoginDatabase() Method","*************creatLoginDatabase*********");
try
{
int i;
String queryString;
// Opens database in writable mode.
myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);
//System.out.println("Table Name : "+tableName.get(0));
queryString = title.get(0)+" VARCHAR(30),";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1;i < title.size() - 1; i++)
{
queryString += title.get(i);
queryString +=" VARCHAR(30)";
queryString +=",";
}
queryString+= title.get(i) +" VARCHAR(30)";
queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "("+queryString+");";
System.out.println("Create Table Stmt : "+ queryString);
myDataBase.execSQL(queryString);
}
catch (SQLException ex)
{
Log.i("CreateDB Exception ",ex.getMessage());
}
}
public void insert(Context context, ArrayList<String> array_vals, ArrayList<String> title, String TABLE_NAME)
{
Log.d("Inside Insert","Insertion starts for table name: "+TABLE_NAME);
// Opens database in writable mode.
myDataBase = context.openOrCreateDatabase("Db",Context.MODE_WORLD_WRITEABLE, null);
String titleString = null;
String markString = null;
int i;
titleString = title.get(0)+",";
markString = "?,";
Log.d("**createDynamicDatabase", "in oncreate");
for(i = 1;i < title.size() - 1; i++)
{
titleString += title.get(i);
titleString +=",";
markString += "?,";
}
titleString+= title.get(i);
markString += "?";
//System.out.println("Title String: "+titleString);
//System.out.println("Mark String: "+markString);
INSERT="insert into "+ TABLE_NAME + "("+titleString+")"+ "values" +"("+markString+")";
System.out.println("Insert statement: "+INSERT);
//System.out.println("Array size iiiiii::: "+array_vals.size());
//this.insertStmt = this.myDataBase.compileStatement(INSERT);
int s=0;
while(s<array_vals.size())
{
System.out.println("Size of array1"+array_vals.size());
//System.out.println("Size of array"+title.size());
int j=1;
this.insertStmt = this.myDataBase.compileStatement(INSERT);
for(int k =0;k< title.size();k++)
{
//System.out.println("Value of column "+title+" is "+array_vals.get(k+s));
//System.out.println("PRINT S:"+array_vals.get(k+s));
System.out.println("BindString: insertStmt.bindString("+j+","+ array_vals.get(k+s)+")");
insertStmt.bindString(j, array_vals.get(k+s));
j++;
}
s+=title.size();
}
insertStmt.executeInsert();
}
我在 onCreate()
中创建了数据库,然后在用户发送消息时插入数据,然后 receives.but 收到此错误。;
android.database.sqlite.SQLiteException: near "08104710280": syntax error (code 1): , while compiling: insert into 08104710280(sender,receiver,msg)values(?,?,?)
在这一行
this.insertStmt = this.myDataBase.compileStatement(INSERT);
查看 SQLiteOpenHelper:
http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
编码示例:
在 android 中首选且更简单的方法是使用 Room library, which greatly reduces boilerplate and works smoothly with other architechture components like LiveData,为您处理后台查询并提供编译时检查,仅需几行代码。