zoukankan      html  css  js  c++  java
  • android聊天,存储聊天记录sqlite

    项目中有聊天模块,需要用到打开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<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();
        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<String,String> param = new HashMap<String, String>();
            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/  这个目录下面
  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/feijian/p/4199848.html
Copyright © 2011-2022 走看看