zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

Android数据库列表SQL数据 创建 语句 内容
2023-09-14 08:57:16 时间
数据库的创建和sql语句增删改查

1. 加载驱动.

2. 连接数据库.

3. 操作数据库.

 

创建表:

create table person(

_id integer primary key,

name varchar(20),

age integer

);

 

添加: insert into person(name, age) values(lisi, 19);

 

删除: delete from person where _id = 1;

 

修改: update person set name = 李四 where name = 王五;

 

查询所有: select * from person;

 

查询单条: select * from person where name = zhangsan;

 

SQLiteExpert3, pc上的工具软件。

package com.itheima28.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class PersonDao {

 private PersonSQLiteOpenHelper mOpenHelper; // 数据库的帮助类对象

 public PersonDao(Context context) {

 mOpenHelper = new PersonSQLiteOpenHelper(context);

 * 添加到person表一条数据

 * @param person

 public void insert(Person person) {

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

 if(db.isOpen()) { // 如果数据库打开, 执行添加的操作

 // 执行添加到数据库的操作

 db.execSQL("insert into person(name, age) values(?, ?);", new Object[]{person.getName(), person.getAge()});

 db.close(); // 数据库关闭

 * 更据id删除记录

 * @param id

 public void delete(int id) {

 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 获得可写的数据库对象

 if(db.isOpen()) { // 如果数据库打开, 执行添加的操作

 db.execSQL("delete from person where _id = ?;", new Integer[]{id});

 db.close(); // 数据库关闭


public void update(int id, String name) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()) { // 如果数据库打开, 执行添加的操作 db.execSQL("update person set name = ? where _id = ?;", new Object[]{name, id}); db.close(); // 数据库关闭 public List Person queryAll() { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { Cursor cursor = db.rawQuery("select _id, name, age from person;", null); if(cursor != null cursor.getCount() 0) { List Person personList = new ArrayList Person int id; String name; int age; while(cursor.moveToNext()) { id = cursor.getInt(0); // 取第0列的数据 id name = cursor.getString(1); // 取姓名 age = cursor.getInt(2); // 取年龄 personList.add(new Person(id, name, age)); db.close(); return personList; db.close(); return null; * 根据id查询人 * @param id * @return public Person queryItem(int id) { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { Cursor cursor = db.rawQuery("select _id, name, age from person where _id = ?;", new String[]{id + ""}); if(cursor != null cursor.moveToFirst()) { int _id = cursor.getInt(0); String name = cursor.getString(1); int age = cursor.getInt(2); db.close(); return new Person(_id, name, age); db.close(); return null; }

package com.itheima28.sqlitedemo.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

 * @author andong

 * 数据库帮助类, 用于创建和管理数据库的.

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

 private static final String TAG = "PersonSQLiteOpenHelper";

 * 数据库的构造函数

 * @param context

 * name 数据库名称

 * factory 游标工程

 * version 数据库的版本号 不可以小于1

 public PersonSQLiteOpenHelper(Context context) {

 super(context, "itheima28.db", null, 2);

 * 数据库第一次创建时回调此方法.

 * 初始化一些表

 @Override

 public void onCreate(SQLiteDatabase db) {

 // 操作数据库

 String sql = "create table person(_id integer primary key, name varchar(20), age integer);";

 db.execSQL(sql); // 创建person表

 * 数据库的版本号更新时回调此方法,

 * 更新数据库的内容(删除表, 添加表, 修改表)

 @Override

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

 if(oldVersion == 1 newVersion == 2) {

 Log.i(TAG, "数据库更新啦");

 // 在person表中添加一个余额列balance

 db.execSQL("alter table person add balance integer;");

}

package com.itheima28.sqlitedemo.entities;

public class Person {

 private int id;

 private String name;

 private int age;

 public int getId() {

 return id;

 public void setId(int id) {

 this.id = id;

 public String getName() {

 return name;

 public void setName(String name) {

 this.name = name;

 public int getAge() {

 return age;

 public void setAge(int age) {

 this.age = age;

 public Person() {

 super();

 // TODO Auto-generated constructor stub

 public Person(int id, String name, int age) {

 super();

 this.id = id;

 this.name = name;

 this.age = age;

 @Override

 public String toString() {

 return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";

}

package com.itheima28.sqlitedemo.test;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.test.AndroidTestCase;

import android.util.Log;

public class TestCase extends AndroidTestCase {

 private static final String TAG = "TestCase";

 public void test() {

 // 数据库什么时候创建

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 // 第一次连接数据库时创建数据库文件. onCreate会被调用

 openHelper.getReadableDatabase();

 public void testInsert() {

 PersonDao dao = new PersonDao(getContext());

 dao.insert(new Person(0, "冠希", 28));

 public void testDelete() {

 PersonDao dao = new PersonDao(getContext());

 dao.delete(1);

 public void testUpdate() {

 PersonDao dao = new PersonDao(getContext());

 dao.update(3, "凤姐");

 public void testQueryAll() {

 PersonDao dao = new PersonDao(getContext());

 List Person personList = dao.queryAll();

 for (Person person : personList) {

 Log.i(TAG, person.toString());

 public void testQueryItem() {

 PersonDao dao = new PersonDao(getContext());

 Person person = dao.queryItem(4);

 Log.i(TAG, person.toString());

 public void testTransaction() {

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 SQLiteDatabase db = openHelper.getWritableDatabase();

 if(db.isOpen()) {

 try {

 // 开启事务

 db.beginTransaction();

 // 1. 从张三账户中扣1000块钱

 db.execSQL("update person set balance = balance - 1000 where name = zhangsan;");

 // ATM机, 挂掉了.

 // int result = 10 / 0;

 // 2. 向李四账户中加1000块钱

 db.execSQL("update person set balance = balance + 1000 where name = lisi;");

 // 标记事务成功

 db.setTransactionSuccessful();

 } finally {

 // 停止事务

 db.endTransaction();

 db.close();

 public void testTransactionInsert() {

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 SQLiteDatabase db = openHelper.getWritableDatabase();

 if(db.isOpen()) {

 // 1. 记住当前的时间

 long start = System.currentTimeMillis();

 // 2. 开始添加数据

 try {

 db.beginTransaction();

 for (int i = 0; i 10000; i++) {

 db.execSQL("insert into person(name, age, balance) values(wang" + i + ", " + (10 + i) + ", " + (10000 + i) + ")");

 db.setTransactionSuccessful();

 } finally {

 db.endTransaction();

 // 3. 记住结束时间, 计算耗时时间

 long end = System.currentTimeMillis();

 long diff = end - start;

 Log.i(TAG, "耗时: " + diff + "毫秒");

 db.close();

}
 ?xml version="1.0" encoding="utf-8"? 

 manifest xmlns:android="http://schemas.android.com/apk/res/android"

 package="com.itheima28.sqlitedemo"

 android:versionCode="1"

 android:versionName="1.0" 

 instrumentation

 android:name="android.test.InstrumentationTestRunner"

 android:targetPackage="com.itheima28.sqlitedemo" 

 /instrumentation 

 uses-sdk

 android:minSdkVersion="8"

 android:targetSdkVersion="17" / 

 application

 android:allowBackup="true"

 android:icon="@drawable/ic_launcher"

 android:label="@string/app_name"

 android:theme="@style/AppTheme" 

 uses-library android:name="android.test.runner" / 

 activity

 android:name="com.itheima28.sqlitedemo.MainActivity"

 android:label="@string/app_name" 

 intent-filter 

 action android:name="android.intent.action.MAIN" / 

 category android:name="android.intent.category.LAUNCHER" / 

 /intent-filter 

 /activity 

 /application 

 /manifest 

使用api方式查询数据库和sqlite3工具

adb shell


package com.itheima28.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class PersonDao2 {

 private static final String TAG = "PersonDao2";

 private PersonSQLiteOpenHelper mOpenHelper; // 数据库的帮助类对象

 public PersonDao2(Context context) {

 mOpenHelper = new PersonSQLiteOpenHelper(context);

 * 添加到person表一条数据

 * @param person

 public void insert(Person person) {

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

 if(db.isOpen()) { // 如果数据库打开, 执行添加的操作

 ContentValues values = new ContentValues();

 values.put("name", person.getName()); // key作为要存储的列名, value对象列的值

 values.put("age", person.getAge());

 long id = db.insert("person", "name", values);

 Log.i(TAG, "id: " + id);

 db.close(); // 数据库关闭

 * 更据id删除记录

 * @param id

 public void delete(int id) {

 SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 获得可写的数据库对象

 if(db.isOpen()) { // 如果数据库打开, 执行添加的操作

 String whereClause = "_id = ?";

 String[] whereArgs = {id + ""};

 int count = db.delete("person", whereClause, whereArgs);

 Log.i(TAG, "删除了: " + count + "行");

 db.close(); // 数据库关闭


public void update(int id, String name) { SQLiteDatabase db = mOpenHelper.getWritableDatabase(); if(db.isOpen()) { // 如果数据库打开, 执行添加的操作 ContentValues values = new ContentValues(); values.put("name", name); int count = db.update("person", values, "_id = ?", new String[]{id + ""}); Log.i(TAG, "修改了: " + count + "行"); db.close(); // 数据库关闭 public List Person queryAll() { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { String[] columns = {"_id", "name", "age"}; // 需要的列 String selection = null; // 选择条件, 给null查询所有 String[] selectionArgs = null; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值 String groupBy = null; // 分组语句 group by name String having = null; // 过滤语句 String orderBy = null; // 排序 Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy); int id; String name; int age; if(cursor != null cursor.getCount() 0) { List Person personList = new ArrayList Person while(cursor.moveToNext()) { // 向下移一位, 知道最后一位, 不可以往下移动了, 停止. id = cursor.getInt(0); name = cursor.getString(1); age = cursor.getInt(2); personList.add(new Person(id, name, age)); db.close(); return personList; db.close(); return null; * 根据id查询人 * @param id * @return public Person queryItem(int id) { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象 if(db.isOpen()) { String[] columns = {"_id", "name", "age"}; // 需要的列 String selection = "_id = ?"; // 选择条件, 给null查询所有 String[] selectionArgs = {id + ""}; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值 String groupBy = null; // 分组语句 group by name String having = null; // 过滤语句 String orderBy = null; // 排序 Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy); if(cursor != null cursor.moveToFirst()) { // cursor对象不为null, 并且可以移动到第一行 int _id = cursor.getInt(0); String name = cursor.getString(1); int age = cursor.getInt(2); db.close(); return new Person(_id, name, age); db.close(); return null;

package com.itheima28.sqlitedemo.test;

import java.util.List;

import android.test.AndroidTestCase;

import android.util.Log;

import com.itheima28.sqlitedemo.dao.PersonDao2;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class TestCase2 extends AndroidTestCase {

 private static final String TAG = "TestCase";

 public void test() {

 // 数据库什么时候创建

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 // 第一次连接数据库时创建数据库文件. onCreate会被调用

 openHelper.getReadableDatabase();

 public void testInsert() {

 PersonDao2 dao = new PersonDao2(getContext());

 dao.insert(new Person(0, "zhouqi", 88));

 public void testDelete() {

 PersonDao2 dao = new PersonDao2(getContext());

 dao.delete(8);

 public void testUpdate() {

 PersonDao2 dao = new PersonDao2(getContext());

 dao.update(3, "fengjie");

 public void testQueryAll() {

 PersonDao2 dao = new PersonDao2(getContext());

 List Person personList = dao.queryAll();

 for (Person person : personList) {

 Log.i(TAG, person.toString());

 public void testQueryItem() {

 PersonDao2 dao = new PersonDao2(getContext());

 Person person = dao.queryItem(4);

 Log.i(TAG, person.toString());

}
事务的操作

事务:

update person set balance = balance - 100 where name = lisi;

update person set balance = balance + 100 where name = zhangsan;

 

// 开启事务

db.beginTransaction();

 

// 标记事务成功

db.setTransactionSuccessful();

 

// 停止事务

db.endTransaction();

 public void testTransaction() {

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 SQLiteDatabase db = openHelper.getWritableDatabase();

 if(db.isOpen()) {

 try {

 // 开启事务

 db.beginTransaction();

 // 1. 从张三账户中扣1000块钱

 db.execSQL("update person set balance = balance - 1000 where name = zhangsan;");

 // ATM机, 挂掉了.

 // int result = 10 / 0;

 // 2. 向李四账户中加1000块钱

 db.execSQL("update person set balance = balance + 1000 where name = lisi;");

 // 标记事务成功

 db.setTransactionSuccessful();

 } finally {

 // 停止事务

 db.endTransaction();

 db.close();

 public void testTransactionInsert() {

 PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

 SQLiteDatabase db = openHelper.getWritableDatabase();

 if(db.isOpen()) {

 // 1. 记住当前的时间

 long start = System.currentTimeMillis();

 // 2. 开始添加数据

 try {

 db.beginTransaction();

 for (int i = 0; i 10000; i++) {

 db.execSQL("insert into person(name, age, balance) values(wang" + i + ", " + (10 + i) + ", " + (10000 + i) + ")");

 db.setTransactionSuccessful();

 } finally {

 db.endTransaction();

 // 3. 记住结束时间, 计算耗时时间

 long end = System.currentTimeMillis();

 long diff = end - start;

 Log.i(TAG, "耗时: " + diff + "毫秒");

 db.close();

 }
LinearLayout展示列表数据
 ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"

 android:layout_height="match_parent" 

 LinearLayout

 android:id="@+id/ll_list"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:orientation="vertical" 

 /LinearLayout 

 /ScrollView 

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.TextView;

public class MainActivity extends Activity {

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 LinearLayout llList = (LinearLayout) findViewById(R.id.ll_list);

 PersonDao dao = new PersonDao(this);

 List Person personList = dao.queryAll();

 if(personList != null) {

 TextView tv;

 for (Person person : personList) {

 // 向线性布局中添加一个textview

 tv = new TextView(this);

 tv.setText(person.toString());

 tv.setTextSize(18);

 llList.addView(tv);


public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true;
ListView的使用和BaseAdater
 LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:orientation="vertical" 

 ListView

 android:id="@+id/listview"

 android:layout_width="match_parent"

 android:layout_height="match_parent" 

 /ListView 

 /LinearLayout 

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

public class MainActivity extends Activity {

 private List Person personList;

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 ListView mListView = (ListView) findViewById(R.id.listview);

 PersonDao dao = new PersonDao(this);

 personList = dao.queryAll();

 // 把view层对象ListView和控制器BaseAdapter关联起来

 mListView.setAdapter(new MyAdapter());

 * @author andong

 * 数据适配器

 class MyAdapter extends BaseAdapter {

 private static final String TAG = "MyAdapter";

 * 定义ListView的数据的长度

 @Override

 public int getCount() {

 return personList.size();

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

 * 此方法返回的是ListView的列表中某一行的View对象

 * position 当前返回的view的索引位置

 * convertView 缓存对象

 * parent 就是ListView对象

 @Override

 public View getView(int position, View convertView, ViewGroup parent) { 

 TextView tv = null; 

 if(convertView != null) { // 判断缓存对象是否为null, 不为null时已经缓存了对象

 Log.i(TAG, "getView: 复用缓存" + position);

 tv = (TextView) convertView;

 } else { // 等于null, 说明第一次显示, 新创建

 Log.i(TAG, "getView: 新建" + position);

 tv = new TextView(MainActivity.this);

 tv.setTextSize(25);

 Person person = personList.get(position); // 获得指定位置的数据, 进行对TextView的绑定

 tv.setText(person.toString());

 return tv;

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

public class MainActivity2 extends Activity {

 private List Person personList;

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 ListView mListView = (ListView) findViewById(R.id.listview);

 PersonDao dao = new PersonDao(this);

 personList = dao.queryAll();

 // 把view层对象ListView和控制器BaseAdapter关联起来

 mListView.setAdapter(new MyAdapter());

 * @author andong

 * 数据适配器

 class MyAdapter extends BaseAdapter {

 private static final String TAG = "MyAdapter";

 * 定义ListView的数据的长度

 @Override

 public int getCount() {

 return personList.size();

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

 * 此方法返回的是ListView的列表中某一行的View对象

 * position 当前返回的view的索引位置

 * convertView 缓存对象

 * parent 就是ListView对象

 @Override

 public View getView(int position, View convertView, ViewGroup parent) {

 View view = null;

 if(convertView == null) {

 // 布局填充器对象, 用于把xml布局转换成view对象

 LayoutInflater inflater = MainActivity2.this.getLayoutInflater();

 view = inflater.inflate(R.layout.listview_item, null);

 } else {

 view = convertView;

 // 给view中的姓名和年龄赋值

 TextView tvName = (TextView) view.findViewById(R.id.tv_listview_item_name);

 TextView tvAge = (TextView) view.findViewById(R.id.tv_listview_item_age);

 Person person = personList.get(position);

 tvName.setText("姓名: " + person.getName());

 tvAge.setText("年龄: " + person.getAge());

 return view;

}

listview_item.xml

 ?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="wrap_content"

 android:orientation="horizontal"

 android:padding="10dip" 

 ImageView

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:src="@drawable/f078" / 

 LinearLayout

 android:layout_width="fill_parent"

 android:layout_height="wrap_content"

 android:layout_marginLeft="10dip"

 android:orientation="vertical" 

 TextView

 android:id="@+id/tv_listview_item_name"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:text="张三" / 

 TextView

 android:id="@+id/tv_listview_item_age"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:layout_marginTop="5dip"

 android:textColor="#FF0000"

 android:text="35" / 

 /LinearLayout 

 /LinearLayout 
其他两种绑定ListView数据的方式
 RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 xmlns:tools="http://schemas.android.com/tools"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 tools:context=".MainActivity" 

 ListView

 android:id="@+id/listview"

 android:layout_width="match_parent"

 android:layout_height="match_parent" / 

 /RelativeLayout 

listview_item.xml

 ?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="wrap_content"

 android:gravity="center_vertical"

 android:orientation="horizontal"

 android:padding="10dip" 

 ImageView

 android:id="@+id/iv_icon"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:src="@drawable/f007" / 

 TextView

 android:id="@+id/tv_name"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content"

 android:layout_marginLeft="10dip"

 android:text="张三"

 android:textColor="#FF0000"

 android:textSize="23sp" / 

 /LinearLayout 
package com.itheima28.simpleadapterdemo;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

 @Override

 protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 ListView mListView = (ListView) findViewById(R.id.listview);

 List Map String, Object data = new ArrayList Map String,Object ();

 Map String, Object map = new HashMap String, Object 

 map.put("name", "张三1");

 map.put("icon", R.drawable.f007);

 data.add(map);

 map = new HashMap String, Object 

 map.put("name", "张三2");

 map.put("icon", R.drawable.f007);

 data.add(map);

 map = new HashMap String, Object 

 map.put("name", "张三3");

 map.put("icon", R.drawable.f007);

 data.add(map);

 map = new HashMap String, Object 

 map.put("name", "张三4");

 map.put("icon", R.drawable.f007);

 data.add(map);

 map = new HashMap String, Object 

 map.put("name", "张三5");

 map.put("icon", R.drawable.f007);

 data.add(map);

 SimpleAdapter adapter = new SimpleAdapter(

 this, // 上下文

 data, // listView绑定的数据

 R.layout.listview_item, // listview的子条目的布局的id

 new String[]{"name", "icon"}, // data数据中的map集合里的key

 new int[]{R.id.tv_name, R.id.iv_icon}); // resource 中的id

 mListView.setAdapter(adapter);

 @Override

 public boolean onCreateOptionsMenu(Menu menu) {

 // Inflate the menu; this adds items to the action bar if it is present.

 getMenuInflater().inflate(R.menu.main, menu);

 return true;

内容提供者创建

 ?xml version="1.0" encoding="utf-8"? 

 manifest xmlns:android="http://schemas.android.com/apk/res/android"

 package="com.itheima28.sqlitedemo"

 android:versionCode="1"

 android:versionName="1.0" 

 instrumentation

 android:name="android.test.InstrumentationTestRunner"

 android:targetPackage="com.itheima28.sqlitedemo" 

 /instrumentation 

 permission android:name="aa.bb.cc.read" /permission 

 permission android:name="aa.bb.cc.write" /permission 

 uses-sdk

 android:minSdkVersion="8"

 android:targetSdkVersion="17" / 

 application

 android:allowBackup="true"

 android:icon="@drawable/ic_launcher"

 android:label="@string/app_name"

 android:theme="@style/AppTheme" 

 uses-library android:name="android.test.runner" / 

 activity

 android:name="com.itheima28.sqlitedemo.MainActivity"

 android:label="@string/app_name" 

 intent-filter 

 action android:name="android.intent.action.MAIN" / 

 category android:name="android.intent.category.LAUNCHER" / 

 /intent-filter 

 /activity 

 provider

 android:name=".providers.PersonContentProvider"

 android:authorities="com.itheima28.sqlitedemo.providers.PersonContentProvider"

 android:readPermission="aa.bb.cc.read"

 android:writePermission="aa.bb.cc.write" 

 /provider 

 /application 

 /manifest 
package com.itheima28.sqlitedemo.providers;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

public class PersonContentProvider extends ContentProvider {

 private static final String AUTHORITY = "com.itheima28.sqlitedemo.providers.PersonContentProvider";

 private static final int PRESON_INSERT_CODE = 0; // 操作person表添加的操作的uri匹配码

 private static final int PERSON_DELETE_CODE = 1;

 private static final int PERSON_UPDATE_CODE = 2;

 private static final int PERSON_QUERY_ALL_CODE = 3;

 private static final int PERSON_QUERY_ITEM_CODE = 4;

 private static UriMatcher uriMatcher;

 private PersonSQLiteOpenHelper mOpenHelper; // person表的数据库帮助对象

 static {

 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

 // 添加一些uri(分机号)

 // content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/insert

 uriMatcher.addURI(AUTHORITY, "person/insert", PRESON_INSERT_CODE);

 // content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/delete

 uriMatcher.addURI(AUTHORITY, "person/delete", PERSON_DELETE_CODE);

 // content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/update

 uriMatcher.addURI(AUTHORITY, "person/update", PERSON_UPDATE_CODE);

 // content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/queryAll

 uriMatcher.addURI(AUTHORITY, "person/queryAll", PERSON_QUERY_ALL_CODE);

 // content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/#

 uriMatcher.addURI(AUTHORITY, "person/query/#", PERSON_QUERY_ITEM_CODE);

 @Override

 public boolean onCreate() {

 mOpenHelper = new PersonSQLiteOpenHelper(getContext());

 return true;

 @Override

 public Cursor query(Uri uri, String[] projection, String selection,

 String[] selectionArgs, String sortOrder) {

 SQLiteDatabase db = mOpenHelper.getReadableDatabase();

 switch (uriMatcher.match(uri)) {

 case PERSON_QUERY_ALL_CODE: // 查询所有人的uri

 if(db.isOpen()) {

 Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);

 return cursor;

 // db.close(); 返回cursor结果集时, 不可以关闭数据库

 break;

 case PERSON_QUERY_ITEM_CODE: // 查询的是单条数据, uri末尾出有一个id

 if(db.isOpen()) {

 long id = ContentUris.parseId(uri);

 Cursor cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder);

 return cursor;

 break;

 default:

 throw new IllegalArgumentException("uri不匹配: " + uri);

 return null;

 @Override

 public String getType(Uri uri) {

 switch (uriMatcher.match(uri)) {

 case PERSON_QUERY_ALL_CODE: // 返回多条的MIME-type

 return "vnd.android.cursor.dir/person";

 case PERSON_QUERY_ITEM_CODE: // 返回单条的MIME-TYPE

 return "vnd.android.cursor.item/person";

 default:

 break;

 return null;

 @Override

 public Uri insert(Uri uri, ContentValues values) {

 switch (uriMatcher.match(uri)) {

 case PRESON_INSERT_CODE: // 添加人到person表中

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

 if(db.isOpen()) {

 long id = db.insert("person", null, values);

 db.close();

 return ContentUris.withAppendedId(uri, id);

 break;

 default:

 throw new IllegalArgumentException("uri不匹配: " + uri);

 return null;

 @Override

 public int delete(Uri uri, String selection, String[] selectionArgs) {

 switch (uriMatcher.match(uri)) {

 case PERSON_DELETE_CODE: // 在person表中删除数据的操作

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

 if(db.isOpen()) {

 int count = db.delete("person", selection, selectionArgs);

 db.close();

 return count;

 break;

 default:

 throw new IllegalArgumentException("uri不匹配: " + uri);

 return 0;

 @Override

 public int update(Uri uri, ContentValues values, String selection,

 String[] selectionArgs) {

 switch (uriMatcher.match(uri)) {

 case PERSON_UPDATE_CODE: // 更新person表的操作

 SQLiteDatabase db = mOpenHelper.getWritableDatabase();

 if(db.isOpen()) {

 int count = db.update("person", values, selection, selectionArgs);

 db.close();

 return count;

 break;

 default:

 throw new IllegalArgumentException("uri不匹配: " + uri);

 return 0;

内容提供者访问和权限

 ?xml version="1.0" encoding="utf-8"? 

 manifest xmlns:android="http://schemas.android.com/apk/res/android"

 package="com.itheima28.othercontentprovider"

 android:versionCode="1"

 android:versionName="1.0" 

 uses-sdk

 android:minSdkVersion="8"

 android:targetSdkVersion="17" / 

 instrumentation

 android:name="android.test.InstrumentationTestRunner"

 android:targetPackage="com.itheima28.othercontentprovider" 

 /instrumentation 

 uses-permission android:name="aa.bb.cc.read"/ 

 uses-permission android:name="aa.bb.cc.write"/ 

 application

 android:allowBackup="true"

 android:icon="@drawable/ic_launcher"

 android:label="@string/app_name"

 android:theme="@style/AppTheme" 

 uses-library android:name="android.test.runner" / 

 activity

 android:name="com.itheima28.othercontentprovider.MainActivity"

 android:label="@string/app_name" 

 intent-filter 

 action android:name="android.intent.action.MAIN" / 

 category android:name="android.intent.category.LAUNCHER" / 

 /intent-filter 

 /activity 

 /application 

 /manifest 
package com.itheima28.othercontentprovider;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

import android.util.Log;

public class TextCase extends AndroidTestCase {

 private static final String TAG = "TextCase";

 public void testInsert() {

 Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/insert");

 // 内容提供者访问对象

 ContentResolver resolver = getContext().getContentResolver();

 ContentValues values = new ContentValues();

 values.put("name", "fengjie");

 values.put("age", 90);

 uri = resolver.insert(uri, values);

 Log.i(TAG, "uri: " + uri);

 long id = ContentUris.parseId(uri);

 Log.i(TAG, "添加到: " + id);

 public void testDelete() {

 Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/delete");

 // 内容提供者访问对象

 ContentResolver resolver = getContext().getContentResolver();

 String where = "_id = ?";

 String[] selectionArgs = {"21"};

 int count = resolver.delete(uri, where, selectionArgs);

 Log.i(TAG, "删除行: " + count);

 public void testUpdate() {

 Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/update");

 // 内容提供者访问对象

 ContentResolver resolver = getContext().getContentResolver();

 ContentValues values = new ContentValues();

 values.put("name", "lisi");

 int count = resolver.update(uri, values, "_id = ?", new String[]{"20"});

 Log.i(TAG, "更新行: " + count);

 public void testQueryAll() {

 Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/queryAll");

 // 内容提供者访问对象

 ContentResolver resolver = getContext().getContentResolver();

 Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, "_id desc");

 if(cursor != null cursor.getCount() 0) {

 int id;

 String name;

 int age;

 while(cursor.moveToNext()) {

 id = cursor.getInt(0);

 name = cursor.getString(1);

 age = cursor.getInt(2);

 Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);

 cursor.close();

 public void testQuerySingleItem() {

 Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/#");

 // 在uri的末尾添加一个id content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/20

 uri = ContentUris.withAppendedId(uri, 20);

 // 内容提供者访问对象

 ContentResolver resolver = getContext().getContentResolver();

 Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, null);

 if(cursor != null cursor.moveToFirst()) {

 int id = cursor.getInt(0);

 String name = cursor.getString(1);

 int age = cursor.getInt(2);

 cursor.close();

 Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);




Android零基础入门第25节:最简单最常用的LinearLayout线性布局 原文:Android零基础入门第25节:最简单最常用的LinearLayout线性布局 良好的布局设计对于UI界面至关重要,在前面也简单介绍过,目前Android中的布局主要有6种,创建的布局文件默认为RelativeLayout相对布局,而在前面的示例学习中,我们只是简单利用了一下LinearLayout线性布局,那么接下来分别对其进行详细学习。