博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android聊天,存储聊天记录sqlite
阅读量:4636 次
发布时间:2019-06-09

本文共 15610 字,大约阅读时间需要 52 分钟。

项目中有聊天模块,需要用到打开activity的时候初始化聊天记录的情况。大致情况如下:

辅助类:ChatSQLiteHelper   在第一次时会调用oncreate方法(判断的标准是schedule.db里面会存储是否已经新建过,若没有,则会调用onCreate,只会调用一次)

package com.example.qurenwu.chat;import android.content.Context;        import android.database.sqlite.SQLiteDatabase;        import android.database.sqlite.SQLiteOpenHelper;        import android.database.sqlite.SQLiteDatabase.CursorFactory;public class ChatSQLiteHelper extends SQLiteOpenHelper{    //调用父类构造器    public ChatSQLiteHelper(Context context, String name, CursorFactory factory,                          int version) {        super(context, name, factory, version);    }    /**     * 当数据库首次创建时执行该方法,一般将创建表等初始化操作放在该方法中执行.     * 重写onCreate方法,调用execSQL方法创建表     * */    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL("CREATE TABLE chat (id INTEGER PRIMARY KEY,"+                "user_id varchar(64), "+                "friend_id varchar(64), "+                "contentChat varchar(255), typeChat varchar(8), "+                "postdateChat DATETIME, "+                "isreadChat integer,"+                "ismineChat integer NOT NULL DEFAULT (0),"+                "deleteChat integer);");    }    //当打开数据库时传入的版本号与当前的版本号不同时会调用该方法    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

以下是使用方法(由于赶时间,下面的代码都是在activity中的页面代码中)

package com.example.qurenwu.qurenwu_2.chat;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.SocketException;import java.net.SocketTimeoutException;import java.net.UnknownHostException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.ContentValues;import android.content.Intent;import android.database.ContentObserver;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.util.DisplayMetrics;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.WindowManager;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import com.example.qurenwu.qurenwu_2.R;import com.example.qurenwu.qurenwu_2.custom.GotaskGlobalVal;import com.example.qurenwu.qurenwu_2.thread.UserHttpThread;import org.json.JSONException;import org.json.JSONObject;public class ChatPageActivity extends Activity implements OnClickListener{    private ImageView back;    private Button mBtnSend;    private EditText mEditTextContent;    private ListView mTalkView;    private ChatMsgAdapter mAdapter;    private List
mDataArrays = new ArrayList
(); private GotaskGlobalVal globalVal; UserHttpThread userHttpThread; private String myuser_id,friend_id; private String friend_head_image_url; //对方头像 private String my_head_image_url; //我的头像 DisplayMetrics dm; int dmwidth; SocketThread st; public DataInputStream dis = null; public DataOutputStream dos = null; Handler handler; SQLiteOpenHelper openHelper; private final int REV_MSG = 1; //接收消息 private final int REQUEST_MINE_HEADURL = 2; //获取我的头像url public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat_page); getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); //软键盘 //获取手机屏幕像素 dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); dmwidth = dm.widthPixels; globalVal = (GotaskGlobalVal) getApplicationContext(); back = (ImageView)findViewById(R.id.back); back.setOnClickListener(this); //接收好友对象资料 Intent intent = getIntent(); friend_id = intent.getStringExtra("friend_id"); friend_head_image_url = intent.getStringExtra("friend_head_image"); //获取对方头像url my_head_image_url = intent.getStringExtra("my_head_image"); //获取自己头像url Log.v("获取头像:","对方头像"+friend_head_image_url+";我的头像:"+my_head_image_url); myuser_id = globalVal.GetUserID(); handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case REV_MSG://处理接收到的消息 String str = msg.obj.toString(); try { int forend = str.indexOf(config.PROTOCOL_FOR_END); //解析str if(forend>0) { String fromname = str.substring(str.indexOf(config.PROTOCOL_COME) + 1, str.indexOf(config.PROTOCOL_COME_END)); String forname = str.substring(str.indexOf(config.PROTOCOL_FOR) + 1, str.indexOf(config.PROTOCOL_FOR_END)); String _date = str.substring(str.indexOf(config.PROTOCOL_DATE) + 1, str.indexOf(config.PROTOCOL_DATE_END)); String forchat = str.substring(str.indexOf(config.PROTOCOL_DATE_END) + 1); ChatMsgEntity entity = new ChatMsgEntity(); entity.setDate(_date); entity.setName(fromname); entity.setText(forchat); entity.setMsgType(true); mDataArrays.add(entity); mAdapter.notifyDataSetChanged(); mTalkView.setSelection(mDataArrays.size()-1); Log.v("Handle接收到的消息",forchat); } } catch (Exception ex) {} break; case REQUEST_MINE_HEADURL: break; } } }; initView(); //1、从本地sqlite数据库获取历史数据 //首次进入,先把聊天记录调出 initdb(); readChat(); //2、socket连接服务器 chatContent(); new Thread(new ReceiveThread()).start(); } //初始化界面 public void initView() { mTalkView = (ListView) findViewById(R.id.listview); mBtnSend = (Button) findViewById(R.id.btn_send); mBtnSend.setOnClickListener(this); mEditTextContent = (EditText) findViewById(R.id.et_sendmessage); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.back: openHelper.close(); finish(); break; case R.id.btn_send: send(); break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && ((FaceRelativeLayout) findViewById(R.id.FaceRelativeLayout)) .hideFaceView()) { Log.v("onKeyDown","表情FaceRelativeLayout"); return true; } return super.onKeyDown(keyCode, event); } private void send() { String contString = mEditTextContent.getText().toString(); //更新界面 if (contString.length() > 0) { ChatMsgEntity entity = new ChatMsgEntity(); entity.setDate(getDate()); entity.setMsgType(false); entity.setText(contString); entity.setHeadImg(my_head_image_url); mDataArrays.add(entity); mAdapter.notifyDataSetChanged(); mEditTextContent.setText(""); mTalkView.setSelection(mTalkView.getCount() - 1); } //发送socket消息 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String date = df.format(new Date()); try { if(dos!=null){ dos.writeUTF(config.PROTOCOL_KEY+config.PROTOCOL_FOR + friend_id + config.PROTOCOL_FOR_END +myuser_id+"end;"+contString); //将发送的消息存入本地 ContentValues con = new ContentValues(); con.put("fromChat", friend_id); con.put("nameChat", myuser_id); con.put("contentChat", contString); con.put("typeChat", "text"); con.put("postdateChat", date); con.put("isreadChat", "1"); con.put("ismineChat", "1"); con.put("deleteChat", "0"); //getContentResolver().insert(DataChangeProvider.CONTENT_URI, con); //保存到本地sqlite SQLiteDatabase db=openHelper.getReadableDatabase(); ContentValues values = new ContentValues(); values.put("user_id",myuser_id); values.put("friend_id",friend_id); values.put("contentChat",contString); values.put("typeChat","text"); values.put("postdateChat",date); values.put("isreadChat",1); values.put("ismineChat",1); db.insert("chat",null,values); db.close(); }else{ Toast.makeText(ChatPageActivity.this, "连接超时,服务器未开放或IP错误,dos is null", Toast.LENGTH_LONG).show(); } }catch (SocketTimeoutException e) { System.out.println("连接超时,服务器未开放或IP错误"+e.getMessage()); Toast.makeText(ChatPageActivity.this, "连接超时,服务器未开放或IP错误", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("连接超时,服务器未开放或IP错误"+e.getMessage()); Toast.makeText(ChatPageActivity.this, "连接超时,服务器未开放或IP错误", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } private String getDate() { Calendar c = Calendar.getInstance(); String year = String.valueOf(c.get(Calendar.YEAR)); String month = String.valueOf(c.get(Calendar.MONTH)); String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1); String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); String mins = String.valueOf(c.get(Calendar.MINUTE)); StringBuffer sbBuffer = new StringBuffer(); sbBuffer.append(year + "-" + month + "-" + day + " " + hour + ":" + mins); return sbBuffer.toString(); } //子线程连接服务器socket public void chatContent(){ new Thread(){ public void run () { try { st = new SocketThread(); st.SocketStart(config.SERVER_IP, config.SERVER_PORT, friend_id); if(st.isConnected()){ dos = st.getDOS(); dis = st.getDIS(); dos.writeUTF(config.PROTOCOL_KEY+config.PROTOCOL_ONLINE+myuser_id); dos.flush(); dos.writeUTF(config.PROTOCOL_KEY+config.PROTOCOL_WAIT+myuser_id); dos.flush(); } }catch (UnknownHostException e) { System.out.println("连接失败"); Toast.makeText(ChatPageActivity.this, "连接失败", Toast.LENGTH_SHORT).show(); e.printStackTrace(); }catch (SocketTimeoutException e) { System.out.println("连接超时,服务器未开放或IP错误"); Toast.makeText(ChatPageActivity.this, "连接超时,服务器未开放或IP错误", Toast.LENGTH_SHORT).show(); e.printStackTrace(); }catch (IOException e) { System.out.println("连接失败"); e.printStackTrace(); } } }.start(); } private class ReceiveThread implements Runnable { public void run() { try { while (true) { try { String str = dis.readUTF(); Message msg = new Message(); msg.what = REV_MSG; msg.obj = str; handler.sendMessage(msg); } catch (NullPointerException ex) {} } } catch (SocketException e) { System.out.println("SocketException"); } catch (IOException e) { e.printStackTrace(); } } } private void RequestUserInfo(String user_id) { Map
param = new HashMap
(); param.put("datatype","5"); param.put("user_id",user_id); userHttpThread = new UserHttpThread(handler,param,REQUEST_MINE_HEADURL); new Thread(userHttpThread).start(); } private void initdb() { //准备数据库,存取聊天记录 openHelper=new ChatSQLiteHelper(this,"chat.db",null,1) ; } private void readChat(){ String _date; String _text; String _isreadChat; String _ismineChat; //0:对方的消息 1:自己发送的消息 boolean _isComMeg = true; //获取数据库中的信息 SQLiteDatabase db=openHelper.getReadableDatabase(); String sql="select contentChat,postdateChat,isreadChat,ismineChat from chat where user_id=? and friend_id=?"; Cursor c = db.rawQuery(sql,new String[]{globalVal.GetUserID(),friend_id}); while(c.moveToNext()){ _text=c.getString(0); _date=c.getString(1); _isreadChat=c.getString(2); _ismineChat=c.getString(3); Log.v("ceshi", _text+_date+_isreadChat); ChatMsgEntity entity = new ChatMsgEntity(); entity.setText(_text); entity.setDate(_date); if(_ismineChat!=null && _ismineChat.equals("0")){_isComMeg= false;} entity.setMsgType(_isComMeg); entity.setHeadImg(_isComMeg?my_head_image_url:friend_head_image_url); mDataArrays.add(entity); } mAdapter = new ChatMsgAdapter(this, mDataArrays,mTalkView); mTalkView.setAdapter(mAdapter); mTalkView.setSelection(mTalkView.getCount() - 1); db.close(); }}

 

说一下我当时遇到的问题:

1、sqlite出现no such table chat  ,原因:没有调用ChatSQLiteHelper的Oncreate方法,因为我在activity中有重写了ChatSQLiteHelper的Oncreate方法

如下:

openHelper=new ChatSQLiteHelper(this,"chat.db",null,1) {public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }public void onCreate(SQLiteDatabase db) {//这里是空的,什么事情都没做,所以也就不会新建chat表了}}

 

2、出现 android_meta***忘记了,反正纠结在数据库的路径这一块,下面大略写出来对比一下

之前错误的写法:

private SQLiteDatabase openDateBase(String dbFile) //dbFile是我自己命名的一个路径:/data/data/你的报名/databases/chat.db    {        File file = new File(dbFile);        if (!file.exists())        {            // // 打开raw中得数据库文件,获得stream流            InputStream stream = this.mContext.getResources().openRawResource(R.raw.chat);  //该目录下也放了一个自己导出来的chat.db,所以不能这么做,自己都晕了            try            {                // 将获取到的stream 流写入道data中                FileOutputStream outputStream = new FileOutputStream(dbFile);            ....            }        }    }

 

现在的写法:

openHelper=new ChatSQLiteHelper(this,"chat.db",null,1) ;  //直接调用,默认ChatSQLiteHelper创建的路径,真实地址应该是:/data/data/你的报名/databases/  这个目录下面

 

转载于:https://www.cnblogs.com/feijian/p/4199848.html

你可能感兴趣的文章
201521430028 武泽坤 网络对抗技术-实验报告-实验二
查看>>
通用版本的 excel 表格
查看>>
JPA和Hibernate的关系
查看>>
面向对象与原型
查看>>
jquery操作css<2>
查看>>
java-多线程-继承THREAD卖票
查看>>
Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)
查看>>
angular-loading用法以及注意事项
查看>>
Android中的Environment.getExternalStorageState使用
查看>>
数据类型的本质
查看>>
[原创]C#引用C++编译的dll
查看>>
函数断点
查看>>
element-ui修改全局样式且只作用于当前页面
查看>>
Juery 高性能编码
查看>>
[leetcode]Roman to Integer
查看>>
mac root permission
查看>>
通过输出流在前台显示zip包中的文件信息
查看>>
安卓图片代码压缩(效果简直爆炸)
查看>>
反射工具类
查看>>
underscore.js _.isNumber[Object]
查看>>