01_android下数据库的创建(重点)
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分标准SQL语句,如:
查询语句:select  from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select  from person
select  from person order by id desc
select name from person group by name having count()>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select  from Account limit 5 offset 3 或者 select  from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person  where id=10
获取添加记录后自增长的ID值:SELECT last_insert_rowid()
SQLiteOpenHelper:管理数据库的版本
在android应用程序中创建按数据库的步骤:
1、写一个DBHelper,继承了SQLiteOpenHelper,重新写了父类的构造方法、onCreate、onUpGrade:
//创建数据库
DBHelper helper = new DBHelper(this, "account.db", null, 1);
onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构
2、调用db = helper.getWritableDatabase(),得到数据对象
02_数据库sql语句的增删改查
创建表结构:create table person (id integer primary key autoincrement,name varchar(20));
插入:insert into person (name)values("lisi");
查询:select * from person;
更新:update person set name='wangwu' where id=1
删除:delete from person where id=1
03_android下数据库的增删改查(重点)
在android应用程序中使用db.execSQL("sql",bindArgs)操作增删改查语句;
1、创建表结构
public void create(View v){
db.execSQL("create table person (id integer primary key autoincrement,name varchar(20))", new Object[]{});
Toast.makeText(this, "创建表结构成功", 0).show();
}
2、插入
public void insert(View v){
db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
Toast.makeText(this, "插入数据成功", 0).show();
}
3、查询:db.rawQuery,cursor类似于一个指针,当cursor指向一条记录时,就把当前记录的数据封装到cursor中,直接从cursor取数据
public void query(View v){
Cursor cursor = db.rawQuery("select * from person",null);
//移动游标,返回值为true表示没有移动到数据集的最后(空),如果为false已经数据集的最后(没有数据了)
while(cursor.moveToNext()){
int id = cursor.getInt(0);
String name = cursor.getString(1);
System.out.println("id="+id+"; name="+name);
}
Toast.makeText(this, "查询数据成功", 0).show();
}
4、更新
public void update(View v){
db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
Toast.makeText(this, "更新数据成功", 0).show();
}
4、删除
public void delete(View v){
db.execSQL("delete from person where id=?", new Object[]{1});
Toast.makeText(this, "删除数据成功", 0).show();
}
04_数据库的另外一种增删改查方法(重点)
使用google提供的另外一种方式操作数据库表:
1、插入数据
public void insert(View v){
//db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
ContentValues values = new ContentValues();
Random r = new Random();
values.put("name", "zhangsan"+r.nextInt(100));
long rowId =  db.insert("person", null, values);
System.out.println("rowId="+rowId);
Toast.makeText(this, "插入数据成功", 0).show();
}
2、查询数据
public void query(View v){
/**
- table 表名
- columns 查询的列
- selection 查询条件"id=1"
- selectionArgs 查询条件的值
- String groupBy
- String having
 - String orderBy
 
- String orderBy
 */
 Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
 
 while(cursor.moveToNext()){
 int id = cursor.getInt(0);
 String name = cursor.getString(1);
 
 System.out.println("id="+id+"; name="+name);
 }
 
 Toast.makeText(this, "查询数据成功", 0).show();
 }
 
 
 
 
 public void update(View v){
 
 // db.execSQL("update person set name='wangwu' where id=?", new Object[]{1});
 //用来封装要修改的列名和值
 ContentValues values = new ContentValues();
 values.put("name", "wangwu");
 db.update("person", values, "id=?", new String[]{"1"});
 Toast.makeText(this, "更新数据成功", 0).show();
 
 }
 
 public void delete(View v){
 
 // db.execSQL("delete from person where id=?", new Object[]{1});
 db.delete("person", "id=?", new String[]{"2"});
 Toast.makeText(this, "删除数据成功", 0).show();
 
 }
 
 - 05_命令行查看数据库
 
 使用adb shell进入模拟器或者手机的控制台;
 使用cd切换到数据库文件所在的目录;
 使用sqlite3 数据库文件的名称打开数据;
 使用增删改查语句操作数据库。
 
 - 11_数据库的事务(重点)- 什么是事务:同一组操作要么同时成功,要么同时失败; 
 
 
 zhangsan -> lisi 100yuan
 1、zhangsan - 100
 2、lisi + 100
 
 - 在android应用程序中使用SQLite数据库事务的步骤:
 
 
 try{
 //1、在业务逻辑开始的时候开启事务:
 db.beginTransaction();
 //张三转出100
 ContentValues values = new ContentValues();
 values.put("money", "1900");
 db.update("account", values, "id=?", new String[]{"1"});
 
 //李四收到100
 ContentValues values02 = new ContentValues();
 values02.put("money", "102");
 db.update("account", values02, "id=?", new String[]{"2"});
 
 //2、 在业务逻辑结束的时候告诉系统数据库提交成功
 db.setTransactionSuccessful();
 } finally{
 //3、告诉系统数据库结束
 db.endTransaction();
 }
 
 
 
 06_listview的使用(重点)
 
 ListView :用来在界面上显示数据列表。
 
 
 MVC:
 Model Person
 View ListView
 Controle Adapter 数据适配器
 
 
 使用listview显示数据列表的步骤:
 1、在布局文件中添加一个listview空间
 2、在代码中找到这个listview控件
 3、创建一个数据适配器为listview填充数据
 
 07_ArrayAdapter使用ArrayAdapter为listview填充数据的步骤: 
 1、在布局文件中添加ListView
 2、在代码中初始化这个listview控件
 3、调用listview.setAdapter()填充数据
 //使用适配器为listview填充数据
 //new ArrayAdapter:context 上下文,resourceId 条目布局文件的资源ID,object[] 要显示的数据
 lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item, new String[]{"王菲","谢霆锋","张柏芝","李亚鹏"}));
 
 
 
 08_SimpleAdapter使用ArrayAdapter为listview填充数据的步骤: 
 1、在布局文件中添加ListView
 2、在代码中初始化这个listview控件
 3、调用listview.setAdapter()填充数据
 //使用适配器为listview填充数据
 //new SimpleAdapter:context 上下文,resourceId 条目布局文件的资源ID,String[] 要显示的列名,int[] 指定列显示在item布局文件的哪个控件上
 lv.setAdapter(new SimpleAdapter(this, data, R.layout.item, new String[]{"id","name"}, new int[]{R.id.tv_id,R.id.tv_name}));
 
 
 条目的布局文件:
 <?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:orientation="vertical" >
 
 
 
 <TextView
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tv_id"
 />
 
 
 <TextView
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:id="@+id/tv_name"
 />
 
 </LinearLayout>
 
 
 
 
 
 09_复杂listview界面的显示(重点)步骤: 
 1、在布局文件中添加ListView
 2、在代码中初始化这个listview控件
 
 lv = (ListView) findViewById(R.id.lv);
 3、自定义数据适配器,继承了BaseAdapter,重写4个方法,其中getCount、getView是我们关系的
 private class MyAdapter extends BaseAdapter{
 
 
 @Override
 public int getCount() {
 
 return 20;
 }
 
 
 
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 
 View view = View.inflate(MainActivity.this, R.layout.item, null);
 
 ImageView iv = (ImageView) view.findViewById(R.id.iv);
 
 TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
 
 tv_title.setText("左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰左香兰");
 
 TextView tv_desc = (TextView) view.findViewById(R.id.tv_desc);
 tv_desc.setText("右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿右向绿");
 return view;
 }
 
 
 @Override
 public Object getItem(int position) {
 // TODO Auto-generated method stub
 return null;
 }
 
 
 @Override
 public long getItemId(int position) {
 // TODO Auto-generated method stub
 return 0;
 }
 
 
 
 
 }
 
 4、调用lv.setAdapter(new MyAdapter())填充数据
 
 
 
 10_数据库listview界面的显示public class MainActivity extends Activity { 
 
 
 private SQLiteDatabase db;
 private ListView lv;
 private List<Person> list;
 
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 
 //初始化listview控件
 lv = (ListView) findViewById(R.id.lv);
 
 DBHelper helper = new DBHelper(this, "persons.db", null, 1);
 
 db = helper.getWritableDatabase();
 
 }
 
 
 
 
 
 public void insert(View v){
 
 // db.execSQL("insert into person (name)values(?)", new String[]{"lisi"});
 ContentValues values = new ContentValues();
 Random r = new Random();
 values.put("name", "zhangsan"+r.nextInt(100));
 long rowId = db.insert("person", null, values);
 System.out.println("rowId="+rowId);
 Toast.makeText(this, "插入数据成功", 0).show();
 }
 
 
 public void query(View v){
 
 list = new ArrayList<Person>();
 /**
 
- 在android应用程序中使用SQLite数据库事务的步骤:
- table 表名
- columns 查询的列
- selection 查询条件"id=1"
- selectionArgs 查询条件的值
- String groupBy
- String having
 - String orderBy) 
 
- String orderBy) 
 */
 Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
 
 while(cursor.moveToNext()){
 
 Person p = new Person();
 int id = cursor.getInt(0);
 p.setId(id);
 String name = cursor.getString(1);
 p.setName(name);
 list.add(p);
 System.out.println("id="+id+"; name="+name);
 }
 
 //把数据显示到列表
 lv.setAdapter(new MyAdapter());
 
 Toast.makeText(this, "查询数据成功", 0).show();
 }
 
 /*
 创建一个数据适配器,为listview填充数据
 */
 private class MyAdapter extends BaseAdapter{
 
 
 @Override
 public int getCount() {
 
 return list.size();
 }
 
 
 
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
 View view = null;
 if(convertView != null){
 view = convertView;
 }
 else{
 view = View.inflate(MainActivity.this, R.layout.item, null);
 }
 
 
 
 TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
 TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
 Person p = list.get(position);
 
 tv_id.setText(p.getId()+"");
 
 tv_name.setText(p.getName());
 return view;
 }
 
 
 @Override
 public Object getItem(int position) {
 // TODO Auto-generated method stub
 return null;
 }
 
 
 @Override
 public long getItemId(int position) {
 // TODO Auto-generated method stub
 return 0;
 }
 
 
 
 
 }
 
 }
 
 
 - 12_对话框合集
 
 1、Toast
 
 
 2、对话框:
 
 - 确定取消对话框
 //1、得到对话框的构造器,用来构造对话框的模版
 AlertDialog.Builder builder = new Builder(this);
 
 //2、构造对话框的模版
 //设置标题
 builder.setTitle("提醒:");
 //设置提示信息
 builder.setMessage("若练此功,必先自宫!");
 
 //设置确定按钮
 builder.setPositiveButton("确定自宫", new OnClickListener() {
 
 @Override
 public void onClick(DialogInterface dialog, int which) {
 Toast.makeText(MainActivity.this, "即使自宫,也未必成功", 0).show();
 }
 });
 
 
 //设置取消按钮
 builder.setNegativeButton("想想再说", new OnClickListener() {
 
 @Override
 public void onClick(DialogInterface dialog, int which) {
 Toast.makeText(MainActivity.this, "若不自宫一定不会成功", 0).show();
 }
 });
 
 //3、使用构造器创建一个对话框
 AlertDialog dialog = builder.create();
 
 //4、显示对话框
 dialog.show();
 
 
- 单选项对话框
 //1、得到对话框的构造器,用来构造对话框的模版
 AlertDialog.Builder builder = new Builder(this);
 
 //2、构造对话框的模版
 //设置标题
 builder.setTitle("请选择性别:");
 //设置提示信息
 
 final String[] items = new String[]{"女","男","其他"};
 builder.setSingleChoiceItems(items, 0, new OnClickListener() {
 
 @Override
 public void onClick(DialogInterface dialog, int which) {
 Toast.makeText(MainActivity.this, "您选择了性别:"+items[which], 0).show();
 
 //关闭对话框
 dialog.dismiss();
 }
 });
 
 //3、使用构造器创建一个对话框
 AlertDialog dialog = builder.create();
 
 //4、显示对话框
 dialog.show();
 //代替前面两行代码
 // builder.show();
 
 
 }
 
 
- 多选对话框
 //1、得到对话框的构造器,用来构造对话框的模版
 AlertDialog.Builder builder = new Builder(this);
 
 //2、构造对话框的模版
 //设置标题
 builder.setTitle("请选择您喜欢吃的水果:");
 //设置提示信息
 
 final String[] items = new String[]{"西瓜","苹果","榴莲","香蕉","草莓","柚子"};
 final boolean[] checkedItems = new boolean[]{false,true,false,false,false,false};
 builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
 
 //dialog当前对话框,which当前点击的选项的数组下标,isChecked当前选项是否被选中
 @Override
 public void onClick(DialogInterface dialog, int which, boolean isChecked) {
 //改变当前选项的值
 checkedItems[which] = isChecked;
 }
 });
 
 //添加提交按钮
 builder.setPositiveButton("提交", new OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
 dialog.dismiss();
 }
 });
 
 //3、使用构造器创建一个对话框
 AlertDialog dialog = builder.create();
 
 //4、显示对话框
 dialog.show();
 //代替前面两行代码
 // builder.show();
 
 
 }
 
 
- 进度对话框
 //得到一个进度对话框的对象
 final ProgressDialog pd = new ProgressDialog(MainActivity.this);
 pd.setTitle("提醒:");
 
 pd.setMessage("请稍等...");
 
 //显示对话框
 pd.show();
 //模拟的耗时的任务
 new Thread(){
 
 public void run() {
 try {
 Thread.sleep(2000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 //关闭对话框
 pd.dismiss();
 };
 }.start();
 
 }
 
- 进度条对话框
 public void button05(View view){
 
 //得到一个进度对话框的对象
 final ProgressDialog pd = new ProgressDialog(MainActivity.this);
 pd.setTitle("提醒:");
 
 pd.setMessage("请稍等...");
 //设置进度条的样式
 pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 //设置最大进度
 pd.setMax(100);
 //显示对话框
 pd.show();
 //模拟的耗时的任务
 new Thread(){
 
 public void run() {
 try {
 for(int i=0; i<100;i++){
 Thread.sleep(100);
 //更新进度
 pd.setProgress(i);
 }
 
 
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 //关闭对话框
 pd.dismiss();
 };
 }.start();
 
 
 }
 
 
 13_帧动画(重点)一组有序的图片一帧一帧的去播放。 
 步骤:
 
 
 1、准备资源文件:
 <?xml version="1.0" encoding="utf-8"?>
 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
 android:oneshot="false" >//如果设置true表示播放一次,false表示循环播放
 
 
 <item
 android:drawable="@drawable/g_1"
 android:duration="200"/>
 <item
 android:drawable="@drawable/g_2"
 android:duration="200"/>
 <item
 android:drawable="@drawable/g_3"
 android:duration="200"/>
 <item
 android:drawable="@drawable/g_4"
 android:duration="200"/>
 <item
 android:drawable="@drawable/g_5"
 android:duration="200"/>
 <item
 android:drawable="@drawable/g_6"
 android:duration="200"/>
 
 <item
 android:drawable="@drawable/g_7"
 android:duration="200"/>
 
 <item
 android:drawable="@drawable/g_8"
 android:duration="200"/>
 
 <item
 android:drawable="@drawable/g_9"
 android:duration="200"/>
 
 <item
 android:drawable="@drawable/g_10"
 android:duration="200"/>
 </animation-list>
 
 
 2、在布局文件中添加ImageView控件
 
 3、设置imgeview的背景资源
 ImageView rocketImage = (ImageView) findViewById(R.id.iv);
 //设置背景资源
 rocketImage.setBackgroundResource(R.drawable.g);
 4、获得动画资源
 AnimationDrawable rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
 5、开始播放动画
 rocketAnimation.start();
 
 14_补间动画改变图片的透明度、缩放、旋转、平移的操作; 
 
- 确定取消对话框