`
shendixiong
  • 浏览: 398641 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

android sqlLite 及Adapter 自定义和Adapter 改变UI

阅读更多

 

Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。

数据库存储在 data/< 项目文件夹 >/databases/ 下。

 

 

另推荐一个网站 http://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/

上面这篇文章很不错!

 

我上网找了些资料! 大部分资料是继承SQLiteDatabase,这样相对来说比较麻烦!

 下面是sqllite代码

 

 

 

public class SqlListeHelper {
    private final static String DATABASE_NAME = "test.db";  //数据库名
    private final static String TABLE_NAME = "sec_pwd";         //表名
    public final static String FIELD_ID = "_id";                //字段名
    public final static String FIELD_TITLE = "sec_Title";              //字段名
    SQLiteDatabase dba ;
    Context _context ;

    /**
     * android.content.Context 中提供了函数 , 注: Activity 是 Context 的子类
     * openOrCreateDatabase () 来创建我们的数据库
    *db = context .openOrCreateDatabase(String DATABASE_NAME , int Context. MODE_PRIVATE , null );
     *String DATABASE_NAME   数据库的名字
     *Int  MODE    操作模式   Context.MODE_PRIVATE 等
     *CursorFactory 指针工厂 ,本例中传入 null ,暂不用
     * @param context
     */
    public SqlListeHelper(Context context) {
        _context = context;
        this.dba = _context.openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE, null);
         createTable();
        //获取数据的存储路径
        System.out.println("------path["+dba.getPath()+"]--------------");

    }


    /**
     * 创建表
     */
    public void createTable() {
        // TODO Auto-generated method stub
        String sql = "Create table " + TABLE_NAME + "(" + FIELD_ID + " integer primary key autoincrement,"
                + FIELD_TITLE + " text )";
        System.out.println("--------onCreate---------" +sql);
        try {
            dba.execSQL(sql);   //执行sql语句 无 返回结果
        } catch (Exception e) {
            System.out.println("table already exists (表已存在)");
        }
    }


    /**
     * 查询表数据
     * @return
     */
    public List select() {
        String sql = "select * from "+TABLE_NAME +" t where 1=1";
        Cursor cursor = dba.rawQuery(sql, new String[]{});
        int size = 0;
        List list= null;
        UserInfo user = null;
        if(cursor !=null)
            size = cursor.getCount();  //获取数据大小
        list = new ArrayList();
        //将指针移到第一条
        cursor.moveToFirst();
        //cursor.isAfterLast() 指是否到最后一条
        while (!cursor.isAfterLast()){
            user = new UserInfo();
            user.setId(cursor.getInt(cursor.getColumnIndex(FIELD_ID)));
            user.setPwd(cursor.getString(cursor.getColumnIndex(FIELD_TITLE)));
            list.add(user);
            //移到下条数据
            cursor.moveToNext();
        }
        cursor.close();
        return list;
    }

    public void insert(int id, String Title) {
            //   new Object[]{id,Title}; 类似 key ,value
            Object[] params = new Object[]{id,Title};
            String sql = "insert into " + TABLE_NAME + "("+FIELD_ID+","+FIELD_TITLE+") VALUES(?,?)";
            System.out.println("addsql = " + sql);
        //执行sql语句
            this.dba.execSQL(sql,params);
    }


}

 

 

 

注意的是 cursor.getColumnIndex  其实类似字符串中的indexOf 作用 也就是获取字段位置 

至于  cursor.getInt () 和 cursor.getString() 我想连

接过数据库的都知道!就不多解释!


大概的就写这两个比较代表性的方法,相对来说,查询比较麻烦点! 而添加与删除和修改差不多!就不多写了!

 

==================  Adapter 的使用 ===============

 

----------------------------    Adapter   重写 start --------------------------------------------------------

 

 

要想更好的使用 Adapter 或者想在listview中更好的添加自己的UI ,用重写 Adapter 就更好不过了
如下代码:

 

 

 

//重写Adapter
    class MyArrayAdapter extends ArrayAdapter{
        private Context _context;
        private List<UserInfo> item;

        public MyArrayAdapter(Context context, int textViewResourceId,List _item) {
            super(context, textViewResourceId);    //To change body of overridden methods use File | Settings | File Templates.
            this.item = _item;
            this._context = context;

        }

        public void add(UserInfo user) {
            if(user == null)
                item = new ArrayList();
            item.add(user);
        }

        @Override
        public int getCount() {
            try {
                if(item == null)
                    return  0;
                else
                    return item.size();
            } catch (Exception e) {
                return 0;
            }
        }

        @Override
        public Object getItem(int position) {
            if(item != null)
                return item.get(position) ;
            else
                return null;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View _convertView = convertView;
            if (convertView == null) {
                LayoutInflater factory = LayoutInflater.from(_context);
                final View textEntryView = factory.inflate(
                        R.layout.listview_item, null);
                _convertView = textEntryView;
            }
            UserInfo userInfo = item.get(position);
            if(userInfo != null){
                TextView id_tv =  (TextView)_convertView.findViewById(R.id.item_idet);
                if(id_tv != null)
                    id_tv.setText(userInfo.getId()+"");
                TextView title_tv =(TextView) _convertView.findViewById(R.id.item_titileet);
                if(title_tv != null)
                    title_tv.setText(userInfo.getPwd());
            }
            return _convertView;
        }
    }

 

 

还有,就是在写activity的事实要继承ListActivity 因为这样更加方便使用 Adapter,
注意的是,有的人,习惯了直接用 findViewById(R.id.item_idet),而不是 _convertView.findViewById(R.id.item_idet)
,如果你这样操作,会导致错误产生!出现空!原因就在于你加载的Layout 的xml配置文件!
其他的都好理解,就是怎么使用List集合!

----------------------------    Adapter   重写 end -------------------------------------------------------- 

 

 

 

 

----------------------------    Adapter   改变UI start -------------------------------------------------------- 
我是用sqllite和此demo一起使用的!有数据才方便测试学习!还有在配置文件中,添加的主配置文件中要添加红线部分(内置ID) 如下图:


private SqlListeHelper helper; 
private static MyArrayAdapter myArrayAdapter = null;  

       setContentView(R.layout.main);
       
    //new MyArrayAdapter(this, R.layout.main, getData()) 可以看重写 就知道原因
        setListAdapter(new MyArrayAdapter(this, R.layout.main, getData()));
      myArrayAdapter = (MyArrayAdapter)getListAdapter(); //此处 myArrayAdapter  为全局 方便UI改变
        if(myArrayAdapter != null)
            System.out.println("getCount["+myArrayAdapter.getCount()+"]");

 private List<Map<String,Object>> getData(){
        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        List data = helper.select();  //查询sqllite表中数据
        Map userMap = null;
        if(data == null)
            return  null;
        return data;
    }
 

注意,UI改变的时候要用到Message ,以及handler不然会出现异常,导致系统崩溃!
    如下!


Message ms = Message.obtain(updateUIHandler); 
                ms.what = UPDATEUIADAPTER;
                ms.obj = u;
                ms.sendToTarget();  
 
//下面最为关键的是  myArrayAdapter.notifyDataSetChanged(); 此行代码 为改变UI关键

 

 

Handler updateUIHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATEUIADAPTER:
                    UserInfo user = (UserInfo)msg.obj;
                    if(user != null && myArrayAdapter != null){
                       myArrayAdapter.add(user);
                       myArrayAdapter =(MyArrayAdapter) getListAdapter();
                       myArrayAdapter.notifyDataSetChanged();
                    }
                    break;
                default:
                    break;
            }
        }


    }   ;
 

 

 

----------------------------    Adapter   改变UI end -------------------------------------------------------- 

下面例子是我与sqllite一起使用的demo代码!sqllite中代码已经在上面贴出与大家分享!

public class MyActivity extends ListActivity
{
    private final int UPDATEUIADAPTER = 1;
    private static EditText addEt = null;
    private static Button addbtn = null;
    private static Button querybtn = null;
    private static EditText queryet = null;
    private static Context _context ;
    private ListView listView = null;
    private SimpleAdapter adapter = null  ;
    private static MyArrayAdapter myArrayAdapter = null;

    private SQLiteDatabase base ;
    private SqlListeHelper helper;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        _context = this;
        helper = new SqlListeHelper(_context);
//        base = helper.getWritableDatabase();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        listView = new ListView(_context);
//
        setListAdapter(new MyArrayAdapter(this, R.layout.main, getData()));
        myArrayAdapter = (MyArrayAdapter)getListAdapter();
        if(myArrayAdapter != null)
            System.out.println("getCount["+myArrayAdapter.getCount()+"]");
        addEt = (EditText)findViewById(R.id.addet);
        queryet = (EditText)findViewById(R.id.queryet);
        addbtn = (Button)findViewById(R.id.addbtn);
        querybtn = (Button)findViewById(R.id.querybtn);
        addbtn.setOnClickListener(addBtnOnClickListener);
        querybtn.setOnClickListener(queryBtnOnClickListener);
    }


    private List<Map<String,Object>> getData(){
        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        List data = helper.select();
        Map userMap = null;
        if(data == null)
            return  null;
        return data;
    }

    View.OnClickListener addBtnOnClickListener = new View.OnClickListener(){

        public void onClick(View view) {
            Toast.makeText(_context,"你好哈!",Toast.LENGTH_LONG).show();
            if(addEt.getText().toString().equals(""))
                return;
            else{
                String addStr = addEt.getText().toString();
                UserInfo u = new UserInfo();
                u.setPwd("hi![" + addStr + "]");
                u.setId(Integer.parseInt(addStr.trim()));
                helper.insert(Integer.parseInt(addStr.trim()), "hi![" + addStr + "]");
                Message ms = Message.obtain(updateUIHandler);
                ms.what = UPDATEUIADAPTER;
                ms.obj = u;
                ms.sendToTarget();
            }
        }
    } ;


    Handler updateUIHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case UPDATEUIADAPTER:
                    UserInfo user = (UserInfo)msg.obj;
                    if(user != null && myArrayAdapter != null){
                       myArrayAdapter.add(user);
                       myArrayAdapter =(MyArrayAdapter) getListAdapter();
                       myArrayAdapter.notifyDataSetChanged();
                    }
                    break;
                default:
                    break;
            }
        }


    }   ;

    View.OnClickListener queryBtnOnClickListener = new View.OnClickListener(){

        public void onClick(View view) {
            List list = helper.select();
            System.out.println("count :"+list.size());
        }
    };

    //重写Adapter
    class MyArrayAdapter extends ArrayAdapter{
        private Context _context;
        private List<UserInfo> item;

        public MyArrayAdapter(Context context, int textViewResourceId,List _item) {
            super(context, textViewResourceId);    //To change body of overridden methods use File | Settings | File Templates.
            this.item = _item;
            this._context = context;

        }

        public void add(UserInfo user) {
            if(user == null)
                item = new ArrayList();
            item.add(user);
        }

        @Override
        public int getCount() {
            try {
                if(item == null)
                    return  0;
                else
                    return item.size();
            } catch (Exception e) {
                return 0;
            }
        }

        @Override
        public Object getItem(int position) {
            if(item != null)
                return item.get(position) ;
            else
                return null;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View _convertView = convertView;
            if (convertView == null) {
                LayoutInflater factory = LayoutInflater.from(_context);
                final View textEntryView = factory.inflate(
                            R.layout.listview_item, null);
                _convertView = textEntryView;
            }
            UserInfo userInfo = item.get(position);
            if(userInfo != null){
                TextView id_tv =  (TextView)_convertView.findViewById(R.id.item_idet);
                if(id_tv != null)
                    id_tv.setText(userInfo.getId()+"");
                TextView title_tv =(TextView) _convertView.findViewById(R.id.item_titileet);
                if(title_tv != null)
                    title_tv.setText(userInfo.getPwd());
            }
            return _convertView;
        }
    }

}
 

 

0
0
分享到:
评论

相关推荐

    android GridViewPaging 分页加载数据

    在Android开发中,GridView是一种...总的来说,实现"android GridViewPaging 分页加载数据"需要对Android的UI组件、数据绑定、事件监听和异步处理有深入的理解。合理地运用这些知识,可以构建出流畅且高效的用户界面。

    Android数据库SQLlite操作demo

    在这个"Android数据库SQLlite操作demo"中,我们将深入探讨如何在Android应用中实现SQLite数据库的使用,特别是涉及到用户注册、登录以及数据的增删查改功能。 首先,让我们来看看如何创建一个简单的用户注册和登录...

    AndroidBasement_sqllite_establish34u_android_

    6. 使用CursorLoader或LiveData进行数据加载和更新,这可以提高UI的响应性,避免主线程阻塞。 此外,项目可能还包括Adapter类,将数据适配到ListView、RecyclerView等视图组件,以及使用ContentProvider来使数据在...

    20120110sqllite

    标题“20120110sqlite”和描述中的“20120110sqlite android”可能指的是一个关于SQLite数据库在2012年1月10日时在Android平台上应用的资料集合。SQLite是一个轻量级的、自包含的、开源的SQL数据库引擎,广泛用于...

    Android 简单通讯录 Sqlite

    在Android UI设计中,ListView通常用于显示大量数据,如通讯录列表。为了将SQLite数据绑定到ListView,我们需要创建一个BaseAdapter的子类,重写其中的方法,如`getView()`。在这个方法里,我们将数据转化为ListView...

    android入门学习源码

    通过Adapter(适配器)将数据绑定到ListView中,可以实现动态加载和滚动效果。适配器模式允许我们用各种不同的数据源(如ArrayList、Cursor等)填充ListView,同时支持自定义item视图,实现高度定制化的显示。 2. *...

    Android应用源码---阿呆提醒器app源码.rar

    这些都是Android基础UI组件,它们的使用涉及到Adapter的定制,以及OnItemClickListener的实现。ListView通常与ArrayList结合,用于显示大量可滚动的数据。单选和多选可能通过RadioGroup和CheckBox实现,而下拉框则...

    查询Sqlite分页显示在ListView里

    我们可以创建一个自定义的Adapter,继承自`BaseAdapter`,并在`getView()`方法中为每个列表项设置视图。适配器的`getCount()`方法应返回数据库中的总记录数,`getItem()`方法返回对应位置的数据,而`getItemId()`...

    kotlin+SQLite+ListView实现简单的数据库操作

    在Android应用开发中,数据库是存储和管理数据的重要工具,SQLite是一个轻量级的、开源的、嵌入式的关系型数据库,广泛应用于移动设备。Kotlin作为一种现代的、静态类型的编程语言,已经成为Android开发的首选语言。...

    简易成绩系统

    【简易成绩系统】是一个基于SQLite数据库、...综上所述,"简易成绩系统"利用SQLite数据库和Android的ListView及Adapter组件,构建了一个功能完备的学生成绩管理系统,实现了数据的高效管理和用户友好的交互体验。

    android开发教程之listview显示sqlite数据

    在Android开发中,ListView是一种常用的组件,用于展示可滚动的列表数据。SQLite则是一个轻量级的...这个例子展示了在Android应用中如何有效地展示和操作本地数据,这对于任何Android开发者来说都是一个重要的技能。

    电视节目预告

    3. **Android控件和组件**:`常用控件及组件`可能包括ListView、GridView、RecyclerView等,用于展示节目列表;TextView、ImageView用于展示文字和图片信息;Button用于用户交互,比如设置提醒或者查看节目详情。...

    Wpf 操作Sqlite数据库

    为了在WPF UI上显示这些数据,你可以使用DataGrid控件,并绑定到数据源。例如: ```xml ``` 在后台代码中,你需要设置DataContext: ```csharp this.DataContext = dataSet.Tables["Employees"]; ``` 总结,WPF...

Global site tag (gtag.js) - Google Analytics