文档章节

简单使用SimpleCursorAdapter

鉴客
 鉴客
发布于 2011/03/30 00:16
字数 579
阅读 1828
收藏 3

如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子类SimpleCursorAdapter。

以下就介绍一下使用sqlite+content provider+cursor adapter的最简单实现示例。太简单了,示例如图:

image

首先,要有个Content provider,如不了解如何实现,请参考编写最简单的Content Provider在Content provider实现中使用SQLiteOpenHelper,下面写的是结合二者的:

public class RiverContentProvider extends ContentProvider {

    public static final Uri CONTENT_URI = Uri
            .parse("content://com.easymorse.cp.rivers");

    public static final String _ID = "_id";

    public static final String NAME = "name";

    public static final String LENGTH = "length";

    private static SQLiteDatabase database;

    private static final int DATABASE_VERSION = 2;

    private static final List<River> RIVERS = new ArrayList<River>();

    static {
        River river = new River("长江", 6380);
        RIVERS.add(river);

        river = new River("黄河", 5464);
        RIVERS.add(river);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues contentValues) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean onCreate() {
        database = new RiverDatabaseHelper(getContext(), "rivers", null,
                DATABASE_VERSION).getReadableDatabase();
        return database != null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        return database.query("rivers", projection, selection, selectionArgs,
                null, null, sortOrder);
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    private static class RiverDatabaseHelper extends SQLiteOpenHelper {

        public RiverDatabaseHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase database) {
            database.execSQL("create table if not exists rivers("
                    + " _id integer primary key autoincrement," + " name text,"
                    + "length integer" + ");");

            SQLiteStatement statement = database
                    .compileStatement("insert into rivers(name,length) values(?,?)");

            for (River r : RIVERS) {
                int index = 1;
                statement.bindString(index++, r.getName());
                statement.bindLong(index++, r.getLength());
                statement.executeInsert();
            }

            statement.close();
        }

        @Override
        public void onUpgrade(SQLiteDatabase database, int oldVersion,
                int newVersion) {
            database.execSQL("drop table if exists rivers");
            onCreate(database);
        }

    }

 

这里写的很简略,没用到的方法都没实现。

在总的布局中使用了ListView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView android:id="@+id/riverList" android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>

使用了自定义的ListView布局,见:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content">
    <TextView android:id="@+id/riverName" android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

 

最后是在Activity中使用contentprovider查询的cursor,生成ListView:

public class ListViewActivity extends Activity {

    private ListView riverListView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        setRiverListViewAdapter();
    }

    private void setRiverListViewAdapter() {
        riverListView = (ListView) this.findViewById(R.id.riverList);

        Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null,
                null, null, null);
        CursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row,
                cursor, new String[] { RiverContentProvider.NAME },
                new int[] { R.id.riverName });
        riverListView.setAdapter(adapter);
    }
}

 

源代码见:

http://easymorse.googlecode.com/svn/tags/CustomListViewDemo-0.1/

本文转载自:http://marshal.easymorse.com/archives/4105

鉴客

鉴客

粉丝 954
博文 35
码字总数 1356
作品 0
长春
高级程序员
私信 提问
教你如何快速获取系统联系人的方法

当今,大部分的应用都涉及到要获取系统的内部资源,现教刚入门的android爱好者如何快速获取系统联系人的方法。 要获取系统联系人,我们就得用到ContentResolver(内容解析者),还有记得要加权...

胡文城
2014/04/09
0
0
sqlite 在 android中使用注意事项

1、模糊查询的陷阱 1 cursor = db.rawQuery("select * from song where song_title like '?%' ", selectionArgs); 这行代码中由于占位符 ? 在单引号内,因此不会被当做占位符,而是对?进行了......

小克898
2012/12/19
485
2
快速上手Android数据库操作

来自:快速上手Android数据库操作 Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式操作系统上有很广泛的应用,WM采用的也是SQLite3 关于过于、原理方面的东...

HonChy
2012/01/07
946
0
使用SQL语句操作SQLite数据库

先上一张效果图: 每次点击“插入”,都会在下面的ListView中新增一行 本文涉及四个文件,分别是DBTest.java、main.xml、line.xml、strings.ml DBTest.java public class DBTest extends Ac...

OliverC
2013/01/21
5K
0
Android之Adapter用法总结

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter...

蜗牛TT
2012/06/12
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Android OkHttp + Retrofit 取消请求的方法

本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求。对于OkHttp来说,具体是调用Call的cancel方法。 ...

shzwork
34分钟前
5
0
并发编程之Callable异步,Future模式

Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或...

codeobj
今天
6
0
Ubuntu环境下安装PaddlePaddle

开篇 深度学习技术是目前非常热门的技术,笔者在闲暇之余决定学习一下这门技术,入门选择了百度开源的PaddlePaddle框架。 paddlepaddle介绍 飞桨(PaddlePaddle) 是国际领先的端到端开源深度学...

豫华商
今天
6
0
LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
今天
6
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部