• 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

  1. package com.ahu.lichang.sqlitedb;
  2.  
  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6.  
  7. /**
  8. * Created by ahu_lichang on 2017/3/18.
  9. */
  10.  
  11. public class MyOpenHelper extends SQLiteOpenHelper {
  12. public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
  13. super(context, name, factory, version);
  14. }
  15. //创建数据库时调用
  16. @Override
  17. public void onCreate(SQLiteDatabase db) {
  18. //创建表
  19. db.execSQL("create table person(_id integer primary key autoincrement,name char(10),salary char(20),phone integer(20))");
  20. }
  21. //升级数据库时调用
  22. @Override
  23. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  24. System.out.println("数据库升级了!!!");
  25. }
  26. }

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

  1. package com.ahu.lichang.sqlitedb;
  2.  
  3. import android.app.Activity;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.os.Bundle;
  6.  
  7. public class MainActivity extends Activity {
  8.  
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13.  
  14. MyOpenHelper oh = new MyOpenHelper(getApplicationContext(),"person.db",null,1);
  15. SQLiteDatabase db = oh.getWritableDatabase();
  16. db.execSQL("insert into person(name,salary,phone) values(?,?,?)",new Object[]{"李某1","20000",1875692});
  17. db.execSQL("insert into person(name,salary,phone) values(?,?,?)",new Object[]{"李某2","50000",1871234});
  18. }
  19. }
  20. //可以进行一系列的增删改查操作。。。。。。

  • 数据库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. 2015/11/6用Python写游戏,pygame入门(6):控制大量的对象

    昨天我们已经实现了这个游戏的三个基本类. 但是现在它还是没办法做成一个适合玩的游戏,毕竟只有一架敌机的游戏是很乏味的.所以,我们需要好多子弹,也需要好多敌机. 所以,我们要创建list,这个list存 ...

  2. Git之版本回退及回滚

    应用场景 当开发某个项目时,会有多次提交记录,如A版本àB版本àC版本,假如目前处于C版本状态,我想回退到A版本,该如何操作:而当回退到A版本后,我又想回滚到B版本,又该如何操作,见下文分解!

  3. [Luogu 1073] NOIP2009 最优贸易

    [Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ...

  4. IIS8.5关于“ 配置错误 不能在此路径中使用此配置节”的解决办法

    今天刚安装好IIS8.5, 我的系统是win8.1 enterprise版本. 建了一个简单的页面准备调试,却发现了这个错误: 详细错误信息模块 IIS Web Core 通知 BeginReques ...

  5. td自动换行

    自动换行方法: 1.在<td>中设置样式style为word-wrap:break-word;word-break:break-all; (一般情况只需要设置word-break:brea ...

  6. 【Loadrunner】LR参数化:利用mysql数据库里面的数据进行参数化

    很多同学都在自学loadrunner去做压力测试,但是如果要利用LR做压力测试,或者是其他工具,其中有一个环节是我们避开不了的,比如说:参数化 今天华华就给大家简要的介绍下,如果你要做的参数化的数据来 ...

  7. F - Number of Connected Components UVALive - 7638 (并查集 + 思维)

    题目链接:https://cn.vjudge.net/contest/275589#problem/F 题目大意:就是给你n个数,如果说两个数之间的gcd!=1,那么就将这两个点连起来,问你最终这些点 ...

  8. hdu 1004 Let the Balloon Rise(字典树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1004 Let the Balloon Rise Time Limit: 2000/1000 MS (J ...

  9. 自然语言处理词向量模型-word2vec

    自然语言处理与深度学习: 语言模型: N-gram模型: N-Gram模型:在自然语言里有一个模型叫做n-gram,表示文字或语言中的n个连续的单词组成序列.在进行自然语言分析时,使用n-gram或者 ...

  10. Once you eliminate all the other factors,the only thing remaining must be the truth.

    Once you eliminate all the other factors,the only thing remaining must be the truth. 一旦你排除了杂因,剩下的一定是 ...