项目中有聊天模块,需要用到打开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/  这个目录下面

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android(安卓)Studio使用mysql-connector-java连接mysql遇到的问
  3. Android(安卓)Studio连接手机设备教程(完全步骤)
  4. bt开发类
  5. 解读Android之HttpURLConnection
  6. android wifi讲解 wifi列表显示
  7. Bluetooth---如何使用Android蓝牙开发
  8. android 使用websocket 实现简单的聊天。
  9. 在linux中配置usb连接

随机推荐

  1. “tns doctor” “You need to have the
  2. Android 折叠效果示例
  3. Android时间互换代码
  4. Annotation processors must be explicit
  5. Android 图片裁剪功能实现详解(类似QQ自定
  6. 【Android(安卓)开发】:TextView的几种使
  7. Anroid中的任务、进程和线程
  8. android 时间,日期对话框
  9. Android 隐藏类的使用
  10. android实现模拟加载中的效果