安卓基础干货(三):安卓数据库的学习


title: 安卓基础干货(三):安卓数据库的学习 copyright: true categories: 安卓基础干货 date: 2018-01-10 19:35:26

tags: [Android]

android下数据库的创建(重点)

在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,也接受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(),得到数据对象

数据库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

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();
}

5.删除      
public void delete(View v){
    db.execSQL("delete from person where id=?", new Object[]{1});
    Toast.makeText(this, "删除数据成功", 0).show();
}

数据库的另外一种增删改查方法(重点)

使用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
    * 
    */
    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();
}

命令行查看数据库

使用adb shell进入模拟器或者手机的控制台; 使用cd切换到数据库文件所在的目录; 使用sqlite3 数据库文件的名称打开数据; 使用增删改查语句操作数据库。

数据库的事务(重点)

什么是事务:同一组操作要么同时成功,要么同时失败;

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();
}

listview的使用(重点)

ListView :用来在界面上显示数据列表。

getCount 
GetView()

listview显示数据的原理:

MVC :
javaweb 
mode: javabean
view: 破jsp
controller:破servlet 

//(1)
对listview的优化 
convertview:  

MVC:
Model  Person  数据
View   ListView
Controle:  Adapter 数据适配器

使用listview显示数据列表的步骤:

1、在布局文件中添加一个listview控件
2、在代码中找到这个listview控件
3、创建一个数据适配器为listview填充数据

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[]{"王菲","谢霆锋","张柏芝","李亚鹏"}));

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>

复杂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("111");

        TextView tv_desc = (TextView) view.findViewById(R.id.tv_desc);
        tv_desc.setText("2222");
        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())填充数据

数据库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>();
    /**
    * table 表名
    * columns 查询的列
    * selection 查询条件"id=1"
    * selectionArgs 查询条件的值
    * String groupBy
    * String having
    * 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;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

第14章 使用Kotlin 进行 Android 开发(2)

我们使用 fastjson 来解析这个数据。在 app 下面的 build.gradle中添加依赖

10320
来自专栏Vamei实验室

安卓第八夜 玛丽莲梦露

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 

10210
来自专栏Android常用基础

Dagger2-从入门到精通(下)

继上篇文章,这篇我们来学习Dagger2的高级用法。如果没看上篇文章的话最好先看下上篇文章再来学习本章,因为本章是接续上篇文章来写的,直接来看的话可能效果不是很...

79120
来自专栏GIS讲堂

安卓中的数据存取

在我们每天使用的手机设备中,无时无刻都在进行着数据的存和取。安卓作为一种手机操作系统,提供了如下方式的数据存取方式:Preference,File,Sqlite...

13520
来自专栏Vamei实验室

安卓第九夜 狂风

我们经常需要在安卓应用中包含简易的网页显示功能。我将在这一讲中实现网页的显示。 《狂风》,来自小Willem,荷兰画派黄金时代的作品。作为当时海上马车夫的荷兰,...

21570
来自专栏KK的小酒馆

APP启动引导页的制作,用ViewPager实现翻页动画

这次制作App的引导页,主要用到2个知识“SharedPreferences 和 ViewPager”

49510
来自专栏Android-薛之涛

Android-Activity与Fragmeng的相互传值

方法一: 一般Framgent都不是单独存在的,所以假设如果我们从ActivityA跳转到FragmentA ,而FragmentA的宿主是MainActivi...

47850
来自专栏Android Note

Android-实用的MVP

15530
来自专栏Fish

SharedPreferences存储数据

使用这个可以在不同的Activity中调用并获得里面保存的值。这个貌似是把里面的内容保存在了一个xml文件里。 Android应用开发SharedPrefe...

237100
来自专栏Vamei实验室

安卓第八夜 玛丽莲梦露

上一讲说明了数据库中存取数据的方法。这一讲将以条目的视图方式,来以相似的视图方式,显示多个数据对象。这种方式特别适合于显示从数据库中取出的多个结构相似的数据,比...

22190

扫码关注云+社区

领取腾讯云代金券