Android 之 SQLite数据库及游标使用案例

查询数据库:
两种方式--
第一种方式:类似INSERT UPDATE DELETE,有两种方法使用select 从SQLite数据库检索数据。
使用rawQuery()直接调用select 语句,使用query() 方法构建一个查询。

小贴士:
* onCreate(); 该方法在数据库第一次创建的时候调用,只调用一次;
* onUpgrade(); 该方法在数据库版本更新的时候调用;
* T-SQL: 国际标准机制
DDL:数据定义语言:create drop alter;
DCL: 数据控制语言:grant revoke;
DML: 数据管理语言:insert delete update select ;
* select 列的列表 from  表的列表 where 条件语句 group by 分组属性 having 分组条件 order by 排

序列 asc|desc limit m, n;
* 游标:游标的实质使一种能从包括多条数据记录的结果集种每次提取一条记录的机制;


游标的使用,Cursor的方法:
* close(); 关闭游标 ,释放资源;
* copyStringToBuffer(int columnIndex,CharArrayBuffer buffer); 在缓冲区中检索请求的列

的文本,将其存储;
* getColumnCount(); 返回所有列的行数;
* getColumnIndex(String columnName); 返回指定的列,如果不存在那么返回-1;
* getColumnIndexOrThrow(String columnName);从0开始返回指定列的名称,如果不存在将抛出异常;
* getColumnName(int columnIndex); 从给定的索引返回列名;
* getColumnNames(); 返回一个字符串数组的列名;
* moveToFirst(); 将游标移动到第一条;
* moveToLast(); 将游标移动到最后一条;
* move(int offset); 将游标移动到指定ID;
* moveToNext(); 将游标移动到下一条;
* moveToPrevious(); 将游标移动到上一条;
* getCount(); 得到游标总记录条数;
* isFirst(); 判断当前游标是否为第一条数据;


案例:创建一个数据库,并在数据库第一次创建的时候初始化创建一张表student,添加记录,
然后查询数据库种表的数据,显示出来;

java代码如下:

	/* 查询数据库 *//* 返回一个游标对象 */
	public Cursor selectData(){
		/* 与数据库获得连接,获得只读属性 */
		SQLiteDatabase sqliteDatabase = dbhelper.getReadableDatabase();

		/* 使用游标保存得到的结果集 *//* 参1:查询语句  ; 参2:查询条件 */
		//Cursor cursor = sqliteDatabase.rawQuery("select * from student", null);
		
		/* 使用查询语句:方式二
		 * @ distinct 			--是否去除重复行  			例:值为:true/false;
		 * @ table				--表名
		 * @ columns 			--要查询的列 				例: new String[]

{"id","name","age"}
		 * @ selection			--查询条件				例:"id>?"
		 * @ selectionArgs		--查询条件的参数 			例:new String[]{"3"}
		 * @ groupBy			--对查询的结果进行分组
		 * @ having				--对分组的结果进行限制
		 * @ orderby			--对查询的结果进行排序;	 例:"age asc"
		 * @ limit				--分页查询限制 ;			 例:"2,5"	

从第2行开始,到第5行结束;注:行数从0 开始;
		 *  */
		Cursor cursor = sqliteDatabase.query(true,"student", new String[]{"_id","name","age"}, 

"_id>?", new String[]{"1"}, null, null, "age desc", "1,5");

		/* 使用游标---获取游标中的数据 */
		while(cursor.moveToNext()){
			String id = cursor.getString(cursor.getColumnIndex("_id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String age = cursor.getString(cursor.getColumnIndex("age"));
			Toast.makeText(MainActivity.this, "_id="+id+" name="+name+"  age="+age, 1000).show();
		}
		
		return cursor;

	}




//案列如下:
实现效果:
仿制手机通讯录,实现编辑,删除的效果;java代码如下:


package com.example.sqliteselection;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import 

android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import 

android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

import android.view.ContextMenu;
import 

android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import 

android.view.View.OnClickListener;
import android.widget.AdapterView;
import 

android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import 

android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import 

android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

	

private EditText edit_age;
	private EditText edit_name;
	private DBHelper dbhelper;
	private Button 

selectBtn,insertBtn;
	private ListView listview ;
	private Cursor cursorTemp;
	private String 

nameTemp;
	private String ageTemp;
	public void init(){
		selectBtn =(Button) findViewById

(R.id.selectBtn); 
		insertBtn = (Button) findViewById(R.id.insertBtn);
		listview = 

(ListView) findViewById(R.id.listView);
	}
	protected void onCreate(Bundle savedInstanceState) {
		

super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		/* 组件对象初始化 */
	

	init();

		/* 创建数据库 */
		dbhelper = new DBHelper(this, "mydb.db", null, 1);


	

	/* 为insertBtn设置店家事件监听器 */
		insertBtn.setOnClickListener(new OnClickListener() {

	

		public void onClick(View v) {
				// TODO Auto-generated method stub
	

			insertData();
				Toast.makeText(MainActivity.this, "数据添加成

功", 1000).show();
			}
		});

		/* 为selectBtn设置点击事件监听器 *//* 

动作:显示ListView组件里面的数据项 */
		selectBtn.setOnClickListener(new OnClickListener() {

		

	public void onClick(View v) {
				Cursor cursor = selectData();

			

	/* cursorTemp临时保存数据集 */
				cursorTemp = cursor;

				

/* 用于填充ListView组件的数据 */
				listViewShow(cursor);
			}
	

	});

		/* 为ListView编写长按事件 *//* 动作,获得条目对应的信息 */
		

listview.setOnItemLongClickListener(new OnItemLongClickListener() {

			public boolean 

onItemLongClick(AdapterView<?> arg0, View arg1,int id, long positive) {

				/* 直接移动到

指定 ID 的游标的数据行数 *//* cursorTemp.move(id-1) */

				/* 获取用户点击的条目信息 */
	

			nameTemp = cursorTemp.getString(cursorTemp.getColumnIndex("name"));
			

	ageTemp = cursorTemp.getString(cursorTemp.getColumnIndex("age"));
				

Toast.makeText(MainActivity.this, "总数:"+cursorTemp.getCount()+"  id="+id+" name="+cursorTemp.getString

(cursorTemp.getColumnIndex("name"))
						+"   

age="+cursorTemp.getString(cursorTemp.getColumnIndex("age")), 1000).show();

				return 

false;
			}
		});

		/*  为ListView组件注册上下文菜单  */
		

registerForContextMenu(listview);

	}

	/* 查询数据库 *//* 返回一个游标对象 */
	public Cursor 

selectData(){
		/* 与数据库获得连接,获得只读属性 */
		SQLiteDatabase sqliteDatabase = 

dbhelper.getReadableDatabase();

		/* 使用游标保存得到的结果集 *//* 参1:查询语句  ; 参2:查询条件 */
	

	//Cursor cursor = sqliteDatabase.rawQuery("select * from student", null);

		/* 使用查询语

句:方式二
		 * @ distinct 			--是否去除重复行  			例:值为:

true/false;
		 * @ table				--表名
		 * @ columns 			

--要查询的列 				例: new String[]{"id","name","age"}
		 * @ selection		

	--查询条件				例:"id>?"
		 * @ selectionArgs		--查询

条件的参数 			例:new String[]{"3"}
		 * @ groupBy			--对查询的结果

进行分组
		 * @ having				--对分组的结果进行限制
		 * @ orderby	

		--对查询的结果进行排序;	 例:"age asc"
		 * @ limit				

--分页查询限制 ;			 例:"2,5"	从第2行开始,到第5行结束;注:行数从0 开始;
		

 *  */
		Cursor cursor = sqliteDatabase.query(true,"student", new String[]{"_id","name","age"}, 

"_id>?", new String[]{"1"}, null, null, "age desc", "1,5");

		/* 使用游标---获取游标中的数据 */
	

	while(cursor.moveToNext()){
			String id = cursor.getString(cursor.getColumnIndex

("_id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			

String age = cursor.getString(cursor.getColumnIndex("age"));
			//Toast.makeText

(MainActivity.this, "_id="+id+" name="+name+"  age="+age, 1000).show();
		}

		return cursor;

	

}

	/* 向数据哭中添加数据 */
	public void insertData(){

		/* 与数据库获得连接,并能对数据

库进行读写  */
		SQLiteDatabase sqliteDatabase = dbhelper.getWritableDatabase();

		/* 插入数据:

方式 一 */
		sqliteDatabase.execSQL("insert into student(name,age) values('mark',18)");
		

sqliteDatabase.execSQL("insert into student(name,age) values('red',24)");
		

sqliteDatabase.execSQL("insert into student(name,age) values('blank',30)");
		

sqliteDatabase.execSQL("insert into student(name,age) values('log',22)");
		

sqliteDatabase.execSQL("insert into student(name,age) values('mark',18)");
		

sqliteDatabase.execSQL("insert into student(name,age) values(?,?)", new Object[]{"mary",20});
		/* 插

入数据:方式二 */
		ContentValues cv = new ContentValues();
		cv.put("name", "jack");
		

cv.put("age", 15);
		sqliteDatabase.insert("student", null, cv);

		/* 清空数据 */
		

cv.clear();
	}

	/* ListView 用于显示查到的数据信息 *//* 使用MVC操控 */
	public void listViewShow

(Cursor cursor){
		/* V 已经确定,为ListView组件 */

		/* M 层,传递过来的Cursor对象 

*/

		/* C 层 ,使用SimpleCursorAdapter适配器进行数据绑定; *//* 条目布局文件自定义 */
		

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listviewlayout, cursor, new String[]

{"name","age"}, new int[]{R.id.name,R.id.age});

		/* 关联C和V */
		listview.setAdapter(adapter);
	

}

	/*------------------------------------------------上下文菜

单------------------------------------------------------*/
	

/*------------------------------------------------------------------------------------------------------------

----*/
	/* 创建上下文菜单 */
	public void onCreateContextMenu(ContextMenu menu, View v,
			

ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		

menu.setHeaderTitle("注册在列表上的上下文");
		menu.setHeaderIcon(getResources().getDrawable

(R.drawable.icon));
		menu.add(1, 0, 1, "编辑");
		menu.add(1, 1, 2, "删除");
		

menu.add(1, 2, 3, "保存");
		menu.add(1, 3, 4, "提取");

	}

	/* 上下文菜单事件 */
	public 

boolean onContextItemSelected(MenuItem item) {
		int id = item.getItemId();

		/* 点击不同的

条目对应不同的处理动作  */
		switch(id){
		case 0:
			Toast.makeText

(MainActivity.this, "点击条目:"+item.toString(), 1000).show();
			editAge();
			

break;
		case 1:
			/* 点击了删除 ,要删除对应的条目*/
			deleteData

(nameTemp, ageTemp);
			Toast.makeText(MainActivity.this, "点击条目:"+item.toString(), 

1000).show();
			break;

		case 2:
			Toast.makeText(MainActivity.this, "点

击条目:"+item.toString(), 1000).show();
			break;

		case 3:
			

Toast.makeText(MainActivity.this, "点击条目:"+item.toString(), 1000).show();
			break;

		

}
		return super.onContextItemSelected(item);

	}

	

/*------------------------------------------------------------------------------------------------------------

----*/
	

/*------------------------------------------------------------------------------------------------------------

----*/

	/* 上下文菜单之编辑:修改年龄 *//* 返回修改之后的值 */
	public void editAge(){
		/* 使用编辑对

话框 *//* new 一个Builder对象 */
		Builder builder = new Builder(this);
		

builder.setTitle(nameTemp);
		builder.setIcon(getResources().getDrawable(R.drawable.icon));

		

/*  通过getLayoutInflater().inflate(R.layout.edit_builder_layout, null)方法获取组件对象  */
		

LinearLayout linearlayout = (LinearLayout) getLayoutInflater().inflate(R.layout.edit_builder_layout, null);

	

	/* 获得EditText 对象 */
		edit_age= (EditText) linearlayout.findViewById(R.id.eidt_age);
		

edit_name = (EditText) linearlayout.findViewById(R.id.eidt_name);

		/* 将原始的数据信息显示在编辑

框内 */
		edit_age.setText(ageTemp);
		edit_name.setText(nameTemp);

		/* 将组件设置

在对话框中 */
		builder.setView(linearlayout);
		builder.setMessage("     input new age:");

	

	/* 设置确定按钮 *//* 点击该按钮执行动作:获取编辑框的值,并更新数据库中的值 */
		

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			public void onClick

(DialogInterface dialog, int which) {
				String newAge = edit_age.getText().toString();
	

			String newName = edit_name.getText().toString();
				

updateData(newName, newAge);
			}
		});

		builder.create().show();
	

}

	/* 更新数据信息 *//* 对数据库进行操作 */
	public void updateData(String newName,String newAge){
	

	/* 连接数据库 */
		SQLiteDatabase sqliteDatabase = dbhelper.getWritableDatabase();

		

/* 删除 */
		ContentValues cv = new ContentValues();
		cv.put("name", newName);
		

cv.put("age", newAge);
		sqliteDatabase.update("student", cv, "name=? and age=?",new String[]

{nameTemp,ageTemp});

		/* 获取游标 */
		Cursor cursor = selectData();
		cursorTemp = 

cursor;

		/* 为组件写值 */
		listViewShow(cursor);
	}

	/* 删除数据信息 *//* 对数据库

进行操作 */
	public void deleteData(String name,String age){
		/* 连接数据库 */
		

SQLiteDatabase sqliteDatabase = dbhelper.getWritableDatabase();

		/* 删除 */
		

sqliteDatabase.delete("student", "name=? and age=?", new String[]{name,age});

		/* 获取游标 */
		

Cursor cursor = selectData();
		cursorTemp = cursor;

		/* 为组件写值 */
		

listViewShow(cursor);
	}


}




//数据库辅助类

package com.example.sqliteselection;

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

public class DBHelper extends SQLiteOpenHelper {

	/* 构造方法 */
	public DBHelper(Context context, String name, CursorFactory factory,int version) {
		super(context, name, factory, version);
		
	}

	/* 第一次创建数据库的 时候调用 , 可进行初始化*/
	public void onCreate(SQLiteDatabase db) {
		System.out.println("onCreate().....第一次创建数据库的时候调用;创建表student");
		
		/* 创建表  _id 的情况比较特殊,游标数据中需要用到;*/
		db.execSQL("create table student(_id Integer primary key autoincrement,name text,age 

Integer)");

	}

	
	/* 数据库版本更新的时候调用  */
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		System.out.println("onUpgrade()....数据库版本更新的时候调用;");
		
		/* 删除表 */
		db.execSQL("drop table student");

	}

}


//自定义布局文件,用于填充到对话框
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearlayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/eidt_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <EditText
        android:id="@+id/eidt_age"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


//列表组件的布局方式
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#F5F5DC"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/name"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="30dp"
        android:text=""
        android:textSize="20sp" />

    <TextView
        android:id="@+id/age"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:text=""
        android:textSize="15sp" />

</LinearLayout>



你可能感兴趣的:(java,android,mvc,sqlite,Cursor)