首页 > 代码库 > Android 数据库读取数据显示 [5]

Android 数据库读取数据显示 [5]

 2016-12-1 课程内容

 昨天学了Android数据库升级、降级、创建 

今天把数据库表里面的数据读取出来显示到手机屏幕上

下面代码是MainActivity.java 的代码 

技术分享
package com.example.winxinmff;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import com.example.entity.Message;
import com.example.winxinmffSQL.R;
import com.j256.ormlite.dao.Dao;

public class MainActivity extends Activity {

    private SimpleAdapter sa; // 是android中一个列表适配器 主要用于做一些简单的列表适配
    private ListView lv;
    private List<Message> messageList = new ArrayList<Message>();
    private List<Map<String, Object>> messageList2 = new ArrayList<Map<String, Object>>();
    private List<Message> messageList3;// 用于ORMLite 的演示
    // 看名字就是databasehelper,数据库助手的意思,这本身就是一个类。
    // 包含了数据库连接,关闭,如果有拓展的话 可能包含基本的数据库JDBC操作方法也就是简化增删改查的一些方法。
    private DatabaseHelper db_helper;

    // 首次创建时,会调用这个方法。
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.weixin);

        // 此3行代码用于创建表结构,以及初始化数据
        MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(
                MainActivity1.this);
        SQLiteDatabase db = helper.getWritableDatabase();
        db.close();

        lv = (ListView) findViewById(R.id.listView1);
        sa = new SimpleAdapter(this, messageList2,// data 不仅仅是数据,而是一个与界面耦合的数据混合体
                R.layout.listview_item_layout, new String[] { "tou",
                        "userName", "lastMessage", "datetime" },// from 从来来
                new int[] { R.id.imageView1, R.id.tv_userName,
                        R.id.tv_lasMessage, R.id.tv_datetime }// to 到那里去
        );
        lv.setAdapter(sa);
        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                Map<String, Object> item = messageList2.get(position);
                item.put("userName", "赵本山" + position);
                sa.notifyDataSetChanged();

            }

        });

    }

    // UI呈现在眼前
    protected void onResume() {
        Log.i("ok", "onResume,界面出现了");

        // 使用ORMLite
        db_helper = new DatabaseHelper(this);
        Dao<Message, Integer> message_dao = db_helper.getMessageDao();
        try {
            messageList3 = message_dao.queryForAll();
            // Log.i("ormlite", "记录条数:"+messageList3.size());
            String t = "记录条数:" + messageList3.size();
            Toast.makeText(this, t, Toast.LENGTH_LONG).show();

        } catch (SQLException e) {
            String t = "记出错:" + e.getMessage();
            Toast.makeText(this, t, Toast.LENGTH_LONG).show();
        }

        // 模拟读取数据库或者互联网

        for (int i = 0; i < messageList3.size(); i++) {
            Message p = new Message();
            p.setTou1("xxx");
            p.setUserName("不对外开放 高内聚 ");
            p.setLastMessage("匿名内部类也就是没有名字的内部类匿名内部类也就是没有名字的内部类");
            p.setDatetime("11.11");
            messageList.add(p);// 上周

            // 定义一个界面与数据的混合体,一个item代表一行记录
            Map<String, Object> item = new HashMap<String, Object>();
            // 一行记录,包含多个控件
            item.put("tou", R.drawable.a);  // 头像
            item.put("userName", messageList3.get(i).getUserName() + i);     // 名字
            item.put("lastMessage", messageList3.get(i).getLastMessage());    // 内容
            item.put("datetime", messageList3.get(i).getDatetime());        // 时间
            messageList2.add(item);             // 添加到集合
        }
        super.onResume();
    }

    // UI完全消失在眼前,完全被另外一个进程覆盖
    protected void onPause() {
        Log.i("ok", "onPause,被抛弃");
        db_helper.close();// ??到底要不要?
        super.onPause();
    }

}
MainActivity

数据库助手类

技术分享
package com.example.winxinmff;

import java.sql.SQLException;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.example.entity.Message;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;

public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
    
    
    private static final String DB_NAME = "mydata.db"; // 数据库名称
    private static final int version = 1; // 数据库版本
    // 定义每一张表的成员变量,其中一个功能:关闭helper,所有DAO对象清理
    private Dao<Message, Integer> messageDao;
    
    public Dao<Message, Integer> getMessageDao(){
        if (messageDao == null) {
            try {
                messageDao = getDao(Message.class);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return messageDao;
    }
    
    
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, version);

    }

    /*
     * 1. 此方法,不会自动执行,需要手动执行,因为它不是回调函数 
     * 2. 最后也不要自己调用,因为只应该执行1次
     */
    public void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {

    }

    /*
     * 此方法,不会自动执行,需要手动执行,因为它不是回调函数
     */
    public void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,
            int arg3) {

    }
    
    protected Object clone() throws CloneNotSupportedException {
        if (messageDao != null) {
            messageDao = null;
        }
        return super.clone();
    }

}
DatabaseHelper

 

 显示效果:

技术分享

和昨天用命令查询是结果是一样的    (图是昨天的)

 技术分享

说一下里面的内容

技术分享

41行 是new一个自己定义的MyDatabaseOpenHelper()方法

43行 getWritableDatabase() 方法以读写方式打开数据库

44行 关闭资源

  Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。

  (getReadableDatabase()方法中会调用getWritableDatabase()方法)

  其中getWritableDatabase() 方法以读写方式打开数据库,

  一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。

 

如果用户从pause(暂停)的状态又回到了你的activity,这个系统resume这个activity并且调用了onResume()这个方法。

技术分享

暂停(pause)你的Activity

  当系统调用activity的onPause()时, 虽然从技术角度来讲你的activity是可见的,

  但是更通常这也预示着用户会离开这个activity,然后你的activity会进入stop状态。

技术分享

 

Activity的生命周期之Pause(暂停)和Resume(重新返回)

http://www.jcodecraeer.com/a/anzhuokaifa/developer/2013/0715/1439.html

 

Android 数据库读取数据显示 [5]