ListActivity与Adapter以及SQLite的使用

摘要

ListActivity、AdapterView、适配器、多个活动、SQLite、GUI样式、菜单资源及MenuInflater。

使用style.xml文件定义style元素

资源文件都使用<resources>标签,style元素使用<style>标签。与此类似的所有的属性都可以放在style里面定义,

<resources>
    <style name="SomeStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:gravity">center</item>
        <item name="android:layout_margin">5dpt</item>
        <item name="android:background">@drawable/somebackground</item>
        <item name="android:textColor">@android:color/white</item>
    </style>
</resources>

在view中使用定义的style

<view 
    style="@style/SomeStyle"/>

在XML中用menu资源定义应用的MenuItem

每一个menu资源XML文件都包含一个根menu元素,里面嵌套的每一个item都代表一个MenuItem。需要为每一个item指定一个android:id属性,以便能够在程序中用对应的MenuItem交互。其他的item属性还包括:

  • android:title和android:titleCondensed表示标题文本和如果显示不了完整的情况下显示的紧凑型标题文本。
  • android:icon指定一个Drawable属性,表示显示的图片。
  • andorid:orderInCategory决定MenuItem出现的顺序。

下面是示例代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item1"
        android:title="item1"
        android:icon="@drawable/item1"
        android:titleCondensed="1"
        android:orderInCategory="1">
    </item>
    <item android:id="@+id/item2"
        android:title="item2"
        android:icon="@drawable/item2"
        android:titleCondensed="2"
        android:orderInCategory="2">
    </item>
</menu>

代码end

ListActivity类和ListView

ListActivity是只包含一个ListView的类。可以使用CursorAdapter作为适配器填充ListView。并且ListActivity是内置ListView。ListView需要设置adapter和OnItemClickListener。同时要使用SimpleCursorAdapter,必须先定义两个数组,分别包含需要映射成GUI组件的列名称及GUI组件的资源ID。SimpleCursorAdapter的构造函数接收如下参数:

  • 运行ListView所在的Context
  • 用来显示ListView中每一项的布局的资源ID
  • 提供数据访问的Cursor,可以提供null,并且在后面指定它
  • 包含要显示的列名称的String数组
  • 包含对应的GUI资源ID的int数组

实例代码如下:

ListView lv=getListView();
lv.setOnitemClickListener(viewListener);

String[] from=new String[]{"name"};
int[] to=new int[]{R.id.to};
CursorAdapter mAdapter=new SimpleCursorAdapter(this,R.layout.listview,null,from,to);
setListAdapter(mAdapter);

当Cursor类不再需要时

Cursor cursor=mAdapter.getCursor();
if(cursor!=null){
    cursor.deactivate();
}
mAdapter.changeCursor(null);

AsyncTask的使用方法

创建一个新的AsyncTask,并且执行它。AsyncTask会在一个单独的线程中执行任务,这里的execute方法的实参表明任务不会接收任何实参,这个方法会接收可变数量的实参,随后它们作为实参被传递给人物的doInBackground方法。每次执行如下方法,都会创建一个新的AsyncTask对象,因为每一个AsyncTask只能执行一次,所以这样是必须的。

AsyncTask是一个要求三个参数的泛型类型:

  • 第一个参数是变长参数表的类型,用于AsyncTask的doInBackground方法。当调用execute方法,doInBackground方法会在一个单独执行线程中执行任务。
  • 第二个参数是变长参数表的类型,用于AsyncTask的onProgressUpdate方法。这个方法在GUI线程中执行,并用来从长时间运行的任务中接收特定类型的过渡性更新数据。
  • 第三个参数是任务结果的类型,它会被传递给AsyncTask的onPostExecute方法。

doInBackground方法使用databaseConnector来打开数据库连接。

private class GetTask extends AsyncTask<Object,Object,Cursor>{
    DatabaseConnector databaseConnector = new DatabaseConnector(AddressBook.this);

    @Override
    protected Cursor doInBackgroudn(Object... params){
        databaseConnector.open();

        return databaseConnector.getAllContacts();
    }

    @Override
    protected void onPostExecute(Cursor result){
        contactAdapter.changeCursor(result);
        dat 大专栏  ListActivity与Adapter以及SQLite的使用abaseConnector.close();
    }
}

创建新的AsyncTask,并执行它。

Bundle extras = getIntent().getExtras();
rowID = extras.getLong("row_id");

new GetTask().execute(rowID);

重写onCreateOptionsMenu和onOptionsItemSelected,使用MenuInflater

使用MenuInflater填充菜单。

@Override
public boolean onCreateOptionsMenu(Menu menu){
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.address_menu,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item){
    Intent addNew = new Intent(this,EditActivity.class);
    startActivity(addNew);
    return super.onOptionsItemSelected(item);
}

实现OnItemClickListener接口

Menu的OnItemClickListener方法的参数

  • 与用户交互的AdapterView引用
  • 点触的列表项的根View的引用
  • ListView中点触的列表项的索引
  • 所选择列表项的唯一long类型的ID,这里即为Cursor中的行ID

下面是示例代码

OnItemClickListener viewContactListener=new OnItemClickListener(){
    @Override
    public void onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){
        Intent viewContact=new Intent(this,ViewContact.class);
        viewContact.putExtra(ROW_ID,arg3);
        startActivity(viewContact);
    }
}

代码end

DatabaseConnector的实用工具类

实用DatabaseConnector工具类管理与SQLite的交互。

public class DatabaseConnector{
    private SQLiteDatabase database;
    private DatabaseOpenHelper databaseOpenHelper;

    public DatabaseConnector(Context context){
        databaseOpenHelper-new DatabaseOpenHelper(context,DATABASE_NAME,1);
    }

    public void open() throws SQLException{
        database=databaseOpenHelper.getWritableDatabase();
    }

    public void close(){
        if(database!=null){
            database.close();
        }
    }

    public void insertContact(String name,String phone){
        ContentValues newContact=new ContentValues();
        newContact.put("name",name);
        newContact.put("phone",phone);

        open();
        database.insert("contacts",newContact);
        close();
    }

    public void updateContact(long id,String name,String phone){
        ContentValues editContact=new ContentValues();
        editContact.put("name",name);
        editContact.put("phone",phone);

        open();
        database.update("contacts",editContact,"_id="+id,null);
        close();
    }

    publci Cursor getAllContacts(){
        return database.query("contacts",new String[]{"_id","name"},"name");
    }

    public Cursor getOneContact(long id){
        return database.query("contacts",null);
    }

    public void deleteContact(long id){
        open();
        database.delete("contacts",null);
        close();
    }
}

getAllContacts方法使用SQLiteDatabase的query方法,取得一个Cursor游标,它的实参如下

  • 要查询的表名称
  • 需返回的列名称的一个String数组
  • 一个SQL WHERE子句,或者是返回全部行的null
  • 实参的String数组会替换WHERE子句里的实参值中的问号占位符。如果WHERE子句中没有实参,则会使用null代替。
  • 一个SQL GROUP BY子句(不包含关键字GROUP BY)或者null(如果不希望分组结果)
  • SQL HAVING子句(不包含HAVING),指定结果中要包含来自于GROUP BY子句中的哪些组,如果GROUP BY子句为null,则这里也为null。
  • SQL ORDER BY子句(不包含关键字ORDER BY),指定结果顺序,或者为null(不指定顺序)

扩展SQLiteOpenHelper

使用SQLiteOpenHelper帮助应用创建数据库并管理版本的变化情况。它要求有如下的4个实参。

  • Context,包含需创建和打开的数据库。
  • 数据库名称,如果希望使用内存数据库,则为null
  • 所使用的CursorFactory,null表示希望使用默认的SQLite CursorFactory
  • 数据库版本号,从1开始。

实例代码如下:

private class DatabaseOpenHelper extends SQLiteOpenHelper{
    public DatabaseOpenHelper(Context context,CursorFactory factory,int version){
        super(context,name,factory,version);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        String createQuery="CREATE TABLE contacts"+"(_id integer primary key autoincrement,"+"name TEXT,phone TEXT);";

        db.execSQL(createQuery);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="