安卓基礎干貨(三):安卓數據庫的學習


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

 }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM