查询数据库:
两种方式--
第一种方式:类似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 stubinsertData();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>



更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android项目复盘3
  4. android中的三种适配器
  5. Android:Umeng(友盟)数据统计(一)
  6. 【Android高级工程师】Android项目开发如何设计整体架构?
  7. 接着归纳Android(安卓)from 《第一行代码》
  8. ListView中的ArrayAdapter
  9. android短彩信数据库设计源码解析(一)

随机推荐

  1. 1563: 高精度加法
  2. 跪求一个java抽奖中奖算法的实现,在线等,急
  3. Cxf 集成spring完整示例
  4. leetcode解题之242# Valid Anagram Java
  5. 自定义视图无法工作,直到我触摸屏幕
  6. RabbitMQ四种Exchange类型之Headers(Java
  7. 将字符串拆分为字符串数组。
  8. Gson将List 反序列化为realmList
  9. 【读书笔记】JavaScript权威指南 第6版 (
  10. java使用compareTo实现一个类的对象之间