1. 程式人生 > >SQLite資料庫、ListView控制元件的使用

SQLite資料庫、ListView控制元件的使用

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

View Code

2、呼叫db = helper.getWritableDatabase(),得到資料庫物件(data/data/包名/databases/person.db,將生成的資料庫檔案pull出來,然後拖入sqliteexpertpersonal軟體中,就可以檢視資料庫表中的資料)

View Code

在這裡插入圖片描述

•資料庫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(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_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 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();
  /**
  * 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§;
    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;
}
}

}