来自:http://www.apkbus.com/android-16354-1-1.html
如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子类SimpleCursorAdapter。
以下就介绍一下使用sqlite+content provider+cursor adapter的最简单实现示例。太简单了,示例如图:
首先,要有个Content provider,如不了解如何实现,请参考编写最简单的Content Provider和在Content provider实现中使用SQLiteOpenHelper,下面写的是结合二者的:
这里写的很简略,没用到的方法都没实现。在总的布局中使用了ListView:
使用了自定义的ListView布局,见:
最后是在Activity中使用contentprovider查询的cursor,生成ListView:
源代码见: <ignore_js_op > SimpleCursorAdapter(安卓巴士源码).rar (51.69 KB, 下载次数: 63)
来自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=54757
在许多时候需要将数据库表中的数据显示在ListView、Gallery等组件中。虽然可以直接使用Adapter对象处理,但工作量很大。为此,Android SDK提供了一个专用于数据绑定的Adapter类:SimpleCursorAdapter。
SimpleCursorAdapter与SimpleAdapter用法相近。只是将List对象换成了Cursor对象。而且SimpleCursorAdapter类构造方法的第四个参数from表示Cursor对象中的字段,而SimpleAdapter类构造方法的第四个参数from表示Map对象中的key。除此之外,这两个Adapter类在使用方法完全相同。
下面是SimpleCursorAdapter类构造方法定义。
public SimpleCursorAdapter(Context context,int layout,Cursor c,String[] from,int[] to);
下例中通过SimpleCursorAdapter类将数据库表绑定在ListView上,也就是说,该ListView会显示数据表的全部记录。在绑定数据前,需要先编写一个SQLiteOpenHelper类的子类,用于操作数据库,代码如下:
package com.li;
import java.util.Random;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBService extends SQLiteOpenHelper {
private final static int DATABASE_VERSION = 1;
private final static String DATABASE_NAME = "test.db";
public DBService(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
String sql = "CREATE TABLE [t_test](" + "[_id]AUTOINC,"
+ "[name]VARCHAR2(20) NOT NULL CONFLICT FAIL,"
+ "CONSTRAINT[sqlite_autoindex_te_test_1]PRIMARY KEY([_id]))";
db.execSQL(sql);
//向test数据库中插入20条记录
Random random = new Random();
for ( int i = 0;i<20;i++)
{
String s = "";
for(int j=0;j<10;j++)
{
char c = (char)(97+random.nextInt(26));
s+=c;
}
db.execSQL("insert into t_test(name)values(?)",new Object[]{s});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
//执行查询语句
public Cursor query(String sql,String[] args)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(sql, args);
return cursor;
}
}
本例不需要对test.db进行升级,因此,只有在DBService类中的oncreate()方法中有创建数据库表的代码。DBService类创建了一个test.db数据库文件,并在该文件中创建了t_test表。在该表中包含两个字段_id和name。其中_id是自增字段,并且是主索引。
下面编写MapsDemo类。MapsDemo类是ListActivity的子类。在该类中的oncreate()方法中创建了DBService对象,然后通过DBService类的query方法查询出t_test表中的所有记录,并返回Cursor对象。MapsDemo类的代码如下:
package com.li;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
public class MapsDemo extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DBService dbService = new DBService(this);
//查询数据
Cursor cursor = dbService.query("select * from t_test", null);
//绑定数据
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter (this,android.R.layout.simple_expandable_list_item_1,cursor,new String[]{"name"},new int[]{android.R.id.text1});
setListAdapter(simpleCursorAdapter);
}
}
SimpleCursorAdapter类构造方法的第四个参数表示返回Cursor对象中的字段名,第五个参数表示要将该字段的值赋给那个组件。该组件在第二个参数中指定的布局文件中定义。
注意:在绑定数据时,Cursor对象返回的记录集中必须包含一个叫"_id"的字段,否则将无法完成数据绑定。也就是说SQL语句不能是select name from t_contacts.如果在数据表中没有"_id"字段,可以采用其他方法来处理。
读到这里可能有人要问:数据存到哪里去了?系统在手机内存中的/data/data/<package name>/databases目录中创建数据库文件。
http://code.google.com/p/android-application-plug-ins-frame-work/
http://hangxin1940.cnblogs.com/
http://my.oschina.net/eclipse88/blog/78872
解决Android解析图片的OOM问题!!!
http://my.eoe.cn/863210/archive/927.html
dialog.xml如下:
<?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="match_parent"
android:background="@android:color/white"
android:orientation="vertical" >
<ListView
android:id="@+id/listView"
android:layout_width="270dip"
android:layout_height="match_parent"
>
</ListView>
</LinearLayout>
listview_item.xml如下:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center"
android:paddingLeft="6dip"
android:minHeight="?android:attr/listPreferredItemHeight"
android:textSize="15dip"
/>
main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="自定义列表对话框"
/>
</RelativeLayout>
styles.xml如下:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light"></style>
<style name="AppTheme" parent="AppBaseTheme">
</style>
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
</resources>
mainActivity如下:
package c.c.testdialog;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
/**
* Demo描述:
* 自定义列表对话框(自定义View中采用ListView)
* 该例比自定义列表对话框(二)的代码和效果都要好
* 遇到的问题:
* 自定义对话框有黑色边框
* 解决办法:
* 设置样式(style)
* 参考资料:
* http://april19880317.blog.51cto.com/1938095/690380
*/
public class MainActivity extends Activity {
private Button mButton;
private View mDialogView;
private Dialog mDialog;
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mButton=(Button) findViewById(R.id.button);
mButton.setOnClickListener(new ClickListenerImpl());
}
private class ClickListenerImpl implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
// 弹出自定义对话框
showDialog();
break;
default:
break;
}
}
}
private void showDialog(){
String[] items = new String[] { "发送电子邮件", "分享到Twitter", "分享到FaceBook"};
LayoutInflater layoutInflater=(LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
mDialogView=layoutInflater.inflate(R.layout.dialog, null);
mListView=(ListView) mDialogView.findViewById(R.id.listView);
ArrayAdapter<String> adapter=
new ArrayAdapter<String>(MainActivity.this, R.layout.listview_item,items);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
switch (arg2) {
case 0:
System.out.println("------> 发送电子邮件");
mDialog.dismiss();
break;
case 1:
System.out.println("------> 分享到Twitter");
mDialog.dismiss();
break;
case 2:
System.out.println("------> 分享到FaceBook");
mDialog.dismiss();
break;
default:
break;
}
}
});
mDialog=new Dialog(MainActivity.this, R.style.dialog);
mDialog.setContentView(mDialogView);
mDialog.show();
}
}