Android基础3

  目录:

        1、在命令行中使用sqlite工具

        2、sqlite数据库的另一种增删改查

        3、sqlite中的事务处理

        4、ListView的用法(充气泵LayoutInflater的用法)

        5、simpleAdapter的用法

  一、在命令行中使用sqlite工具

      1 cmd adb shell 首先挂载到linux

      2 cd data/data/com.android.contacts.provider

      3 cd databases

      4 sqlite3 contacts 打开数据库 eg: sqlite3 contacts.db

      5 .tables 查看所有的表 eg: .table

      6 .schema 查看所有的创建表、视图的语句 eg: .schema

      7 .help 查看帮助 eg: .help

      8 .header(s) NO |OFF是否显示列头信息 eg: headers ON

      9 .mode MODE ?table? 指定数据显示风格 eg: .mode column

      10 .nullValue NULL空值数据显示问题 eg: .nullValue NULL

      案例:

      

  二、sqlite的另一种增删改查

      1、自定义的数据库帮助类:MyDataBaseOpenHelper

 1 package cn.tangjie.database;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 
 7 public class MyDataBaseOpenHelper extends SQLiteOpenHelper{
 8     private final static String name = "soyoung.db";
 9     private final static int version = 1;
10 
11     public MyDataBaseOpenHelper(Context context) {
12         super(context, name, null, version);
13     }
14 
15     @Override
16     public void onCreate(SQLiteDatabase db) {
17          // db.execSQL("CREATE TABLE IF NOT EXISTS person (name varchar(20) primary key, phone varchar(20)");
18         db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
19         System.out.println("表创建成功!");
20     }
21 
22     @Override
23     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
24         db.execSQL("ALTER TABLE person ADD phone varchar(20) NULL");
25 
26     }
27 }

  2、创建好数据库之后进行单元测试,判断数据库和表结构是否创建成功

1     public void test(){
2         
3         new MyDataBaseOpenHelper(getContext()).getReadableDatabase();
4     }

  提示:如果报一下的错误,基本上是由于创建表中的sql语句有错误

android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /data/data/com。。。。

  3、编写数据库的操作类 完成数据库的增删改查:

 1 package cn.tangjie.database.dao;
 2 
 3 import cn.tangjie.database.MyDataBaseOpenHelper;
 4 import android.content.ContentValues;
 5 import android.content.Context;
 6 import android.database.Cursor;
 7 import android.database.sqlite.SQLiteDatabase;
 8 
 9 public class MyDatabase {
10     private MyDataBaseOpenHelper helper;
11 
12     public MyDatabase(Context context) {
13         this.helper = new MyDataBaseOpenHelper(context);
14     }
15 
16     public void add(String name, int age) {
17         if (find(name)) {
18             return;
19         }
20         SQLiteDatabase db = helper.getReadableDatabase();
21         ContentValues values = new ContentValues();
22         values.put("name", name);
23         values.put("age", age);
24         db.insert("person", null, values);
25     }
26 
27     public boolean find(String name) {
28         SQLiteDatabase db = helper.getReadableDatabase();
29         Cursor cusor = db.query("person", null, "name=?",
30                 new String[] { name }, null, null, null);
31         if (cusor.moveToFirst()) {
32             return true;
33         }
34         return false;
35     }
36 }

  

  三、sqlite中的事务处理

       beginTransaction:启动事务

       endTransaction:停止事务

       setTransactionSuccessful:设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务

       代码如下:

 1 SQLiteDatabase db = ....;
 2 db.beginTransaction();//开始事务
 3 try {
 4     db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"tangjie", 4});
 5     db.execSQL("update person set name=? where personid=?", new Object[]{"wangzhen", 1});
 6     db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
 7 } finally {
 8     db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
 9 } 
10 db.close(); 

   四、ListView的用法

        1、直接通过案例来看:使用LayoutInflater自定义listView的使用:

        第一步:编写items.xml文件:在xml文件中用两个文本组件来存放listView每个列表中的数据

 1  <TextView
 2         android:id="@+id/lv_name"
 3         android:layout_width="wrap_content"
 4         android:layout_height="wrap_content"
 5         android:text="@string/lv_name" />
 6 
 7     <TextView
 8         android:id="@+id/lv_tel"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="@string/lv_tel" />

       第二步:从数据库中取出数据,用于准备设置到listView中,这步类似于上面的crud操作,再次省略。

       第三步:Activity中的代码:设置listview的适配器,通过LayoutInflater充气泵将信息设置到items对应的组件上。

                 MyAdapter中的getCount方法决定listView的行数,决定着调用多少次getView方法的调用次数、getView方法不断地将组件设置到listview中 


 1 package com.lewu.listview;
 2 
 3 import java.util.List;
 4 
 5 import com.lewu.database.dao.MyDatabase;
 6 import com.lewu.domian.Person;
 7 
 8 import android.app.Activity;
 9 import android.os.Bundle;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.BaseAdapter;
14 import android.widget.ImageView;
15 import android.widget.ListView;
16 import android.widget.TextView;
17 
18 public class ListviewActivity extends Activity {
19 
20     private ListView lv;
21     private List<Person> persons;
22     private LayoutInflater inflater;
23     @Override
24     public void onCreate(Bundle savedInstanceState) {
25         super.onCreate(savedInstanceState);
26         setContentView(R.layout.main);
27         
28         persons = new MyDatabase(this).findAll();
29         
30         System.out.println(persons.size());
31 
32         lv = (ListView) findViewById(R.id.lv);
33         lv.setAdapter(new MyAdapter());
34         
35         inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
36 
37     }
38 
39     class MyAdapter extends BaseAdapter {
40 
41         @Override
42         public int getCount() {
43             return persons.size();
44         }
45 
46         @Override
47         public Object getItem(int position) {
48 
49             return null;
50         }
51 
52         @Override
53         public long getItemId(int position) {
54             // TODO Auto-generated method stub
55             return 0;
56         }
57 
58         @Override
59         public View getView(int position, View convertView, ViewGroup parent) {
60             Person person = persons.get(position);
61             View view = inflater.inflate(R.layout.items, null);
62             TextView view1 = (TextView)view.findViewById(R.id.lv_name);
63             TextView view2 = (TextView) view.findViewById(R.id.lv_tel);
64             view1.setText(person.getName());
65             view2.setText(person.getPhone());
66             return view;
67         }
68 
69     }
70 }

运行结果:
  
  

 五、simpleAdapter的用法

 1     public void onCreate(Bundle savedInstanceState) {
 2         super.onCreate(savedInstanceState);
 3         setContentView(R.layout.main);
 4 
 5         persons = new MyDatabase(this).findAll();
 6 
 7         System.out.println(persons.size());
 8 
 9         lv = (ListView) findViewById(R.id.lv);
10 
11         datas = new ArrayList<Map<String, String>>();
12 
13         for (Person p : persons) {
14             Map<String, String> map = new HashMap<String, String>();
15             map.put("name", p.getName());
16             map.put("phone", p.getPhone());
17             datas.add(map);
18         }
19 
20         lv.setAdapter(new SimpleAdapter(this, datas, R.layout.items,
25                 new String[] { "name", "phone" }, new int[] { R.id.lv_name,
26                         R.id.lv_tel }));
27 
28     }

       

原文地址:https://www.cnblogs.com/tagie/p/3063760.html