• 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(‘lc’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘lc‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10

获取添加记录后自增长的ID值:SELECT last_insert_rowid()

SQLiteOpenHelper:管理数据库的版本

在android应用程序中创建按数据库的步骤:
  1、写一个DBHelper,继承了SQLiteOpenHelper,重新写了父类的构造方法、onCreate、onUpGrade

 package com.ahu.lichang.sqlitedb;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; /**
* Created by ahu_lichang on 2017/3/18.
*/ public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
db.execSQL("create table person(_id integer primary key autoincrement,name char(10),salary char(20),phone integer(20))");
}
//升级数据库时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级了!!!");
}
}

  2、调用db = helper.getWritableDatabase(),得到数据库对象(data/data/包名/databases/person.db,将生成的数据库文件pull出来,然后拖入sqliteexpertpersonal软件中,就可以查看数据库表中的数据)

 package com.ahu.lichang.sqlitedb;

 import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); MyOpenHelper oh = new MyOpenHelper(getApplicationContext(),"person.db",null,1);
SQLiteDatabase db = oh.getWritableDatabase();
db.execSQL("insert into person(name,salary,phone) values(?,?,?)",new Object[]{"李某1","20000",1875692});
db.execSQL("insert into person(name,salary,phone) values(?,?,?)",new Object[]{"李某2","50000",1871234});
}
}
//可以进行一系列的增删改查操作。。。。。。

  • 数据库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 :用来在界面上显示数据列表。一行一个条目,每一个条目都是一个View对象。

getCount
getView()

listview显示数据的原理:
MVC :
javaweb
mode: javabean
view: jsp
controller:servlet

对listview的优化
convertview:

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

使用listview显示数据列表的步骤:(整个界面有个大的布局,然后每个item又要一个布局文件)
  1、在布局文件中添加一个listview控件:lv
  2、在代码中找到这个listview控件:findViewById(R.id.lv)
  3、创建一个数据适配器为listview填充数据:lv.setAdapter(new MyAdapter())---ArrayAdapter、SimpleAdapter、BaseAdapter

  • 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界面的显示BaseAdapter(重点)

步骤:
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;
}
}

}

SQLite数据库、ListView控件的使用的更多相关文章

  1. 将数据库数据添加到ListView控件中

    实现效果: 知识运用: ListView控件中的Items集合的Clear方法 //从listView控件的数据项集合中移除所有数据项 补充:可以使用Remove或RemoveAt方法从集合中移除单个 ...

  2. C#在listview控件中显示数据库数据

    一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 ...

  3. 《ASP.NET1200例》ListView控件之修改,删除与添加

    aspx <body> <form id="form1" runat="server"> <div> <asp:Lis ...

  4. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>

    分页     在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...

  5. ListView控件使用

    //ListView标头的代码创建方法. ColumnHeader title=new ColumnHeader(); //声明标头,并创建对象. title.Text="标头1名称&quo ...

  6. C# ListView控件使用简介

    ListView控件在各类程序中,具有数据显示直观,操作方便的特点.所以使用率极高,但控件的各类参数众多,很多初学者不易掌握,在此列举该控件的一些常用方法,属性,希望对初学者有一定帮助. //2005 ...

  7. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  8. ListView控件

      打气筒工具:将R.layout.item_listview布局添加到相应的view控件里面 View view=LayoutInflater.from(ScondPro.this).inflate ...

  9. Android中ListView控件的使用

    Android中ListView控件的使用 ListView展示数据的原理 在Android中,其实ListView就相当于web中的jsp,Adapter是适配器,它就相当于web中的Servlet ...

随机推荐

  1. windows10安装ipython jupyter

    环境: windows 10 x64 python2.7(已经安装好numpy scipy matplotlib) 过程: 首先安装visual c++ 9.0环境,去http://aka.ms/vc ...

  2. 【转载】BP神经网络

    原文地址:http://blog.csdn.net/acdreamers/article/details/44657439 今天来讲BP神经网络,神经网络在机器学习中应用比较广泛,比如函数逼近,模式识 ...

  3. 网页实战开发笔记之——最全面的HTML的头部信息介绍

    HTML中我们一般把<head></head>部分称为网页的头部.头部部分的内容虽然不会在页面中显示,但它能影响到搜索引擎对网页的收录和排序,以及网页的各种全局设置,可以说是至 ...

  4. # 20155222 2016-2017-2 《Java程序设计》第5周学习总结

    20155222 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 java中所有错误都会被包装为对象,如果你愿意,可以尝试(try)执行程序并捕捉代表错误的对 ...

  5. SQL查找数据库中所有没有主键的数据表脚本

    --SQL查找数据库中所有没有主键的数据表脚本 --运行脚本后在消息中可能会显示下面现象中的一种:--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)--(2)当前数据表[数据表名]没有主 ...

  6. python 操作 memcache

    目录 Memcached Memcached安装 python操作Memcached Memcache模块常用方法 Memcached Memcached是一个高性能的分布式内存对象缓存系统,用于动态 ...

  7. python3学习笔记.4.turtle绘图

    先放上参考 https://docs.python.org/3/library/turtle.html //********************************************** ...

  8. 当遇到not a dynamic executable时怎么做

    当我使用ldd查找Drcom所缺少的32为库的时候提示not a dynamic executable 最后网上找到答案 来自http://forum.ubuntu.org.cn/viewtopic. ...

  9. ntpdate[35450]: the NTP socket is in use, exiting

    当前主机已是NTP服务器,需关闭当前NTP服务,再同步其他NTP服务器的时间 service ntpd stop 然后ps -ef | grep ntp看进程是否已杀掉 然后再次ntpdate Ser ...

  10. gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化【转】

    转自:http://blog.csdn.net/qinrenzhi/article/details/78334677 相关博客http://blog.chinaunix.net/uid-2495495 ...