Android之ContentProvider详解

    ContentProvider为Android四大组件之一,主要用来应用程序之间的数据共享,也就是说一个应用程序用ContentProvider将自己的数据暴露出来,其他应用程序通过 ContentResolver来对其暴露出来的数据进行增删改查。

      ContenProvider与ContentResolver之间的对话同过Uri(通用资源标识符),一个不恰当的比喻就好像浏览器要显示一个网页要有一个东西发送请求,这相当于ContentResolver,你要拿东西就要知道去哪里拿,你就得知道服务器的域名或网址,而这个网址就相当于Uri,当到达服务器的时候服务器要有个东西来处理,这就相当于ContenProvider。

 

A程序通过ContenProvider来暴露数据的基本步骤:

   1、实现一个ContenProvider的子类,并重写query,insert,update,delete等这几个方法,

    2、在androidmanifest.xml中注册ContenProvider,指定的android:authorities属性

B程序通过ContentResolver来操作A程序暴露出来的数据的基本步骤

   1、通过content的getContentResolver()来获取ContentResolver对象

   2、通过ContentResolver对象来query,insert,update,delete来进行操作

在实现query,insert,update,delete时有一个重要的参数Uri类,Uri一个中要的方法Uri.parse(String str)用来解析str字符串,而str字符串格式一般都有A程序提供给B程序,B程序按照指定的格式去请求 。比如:content//:com.android.xiong.ConentProviderTestA.firstContentProvider/xiong 其格式一般分为三个部分:content//:这部分是固定不变的 而com.android.xiong.ConentProviderTestA.firstContentProvider表A程序在androidmanifest.xml注册的android:authorities属性,xiong则表示资源部分

  1.        <provider  
  2.            android:name="com.android.xiong.conentprovidertesta.FirstContentProvider"  
  3.            android:authorities="com.android.xiong.ConentProviderTestA.firstContentProvider"  
  4.            android:exported="true" >  
  5. </provider>  

 

 

实例如下

   A程序:

  UserInfo.java
  1. package com.android.xiong.conentprovidertesta;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentValues;  
  5. import android.content.UriMatcher;  
  6. import android.database.Cursor;  
  7. import android.database.sqlite.SQLiteDatabase;  
  8. import android.net.Uri;  
  9.   
  10. public class FirstContentProvider extends ContentProvider {  
  11.   
  12.     // UriMatcher类主要用来匹配Uri  
  13.     private static final UriMatcher uriMatcher = new UriMatcher(  
  14.             UriMatcher.NO_MATCH);  
  15.     private MySqlite mysqlite;  
  16.     static {  
  17.         // 注册向外部程序提供的Uri  
  18.         uriMatcher.addURI(UserInfo.AUTOR, "userinfo"1);  
  19.         uriMatcher.addURI(UserInfo.AUTOR, "userinfoall"2);  
  20.     }  
  21.     //删除数据  
  22.     @Override  
  23.     public int delete(Uri uri, String selection, String[] selectionArgs) {  
  24.         int number = 0;  
  25.         if (uriMatcher.match(uri) == 1) {  
  26.             // 根据条件删除数据,并获取删除的行数  
  27.             number = mysqlite.getReadableDatabase().delete("user_info",  
  28.                     selection, selectionArgs);  
  29.         }  
  30.         // 通知数据已经改变  
  31.         getContext().getContentResolver().notifyChange(uri, null);  
  32.         return number;  
  33.     }  
  34.   
  35.     @Override  
  36.     public String getType(Uri uri) {  
  37.   
  38.         return null;  
  39.     }  
  40.     //插入数据  
  41.     @Override  
  42.     public Uri insert(Uri uri, ContentValues values) {  
  43.         String name = values.getAsString(UserInfo.User.NAME).toString();  
  44.         String age = values.getAsInteger(UserInfo.User.AGE).toString();  
  45.         String maxId = "select max(id) id from user_info";  
  46.         Cursor cursor = mysqlite.getReadableDatabase().rawQuery(maxId, null);  
  47.         cursor.moveToFirst();  
  48.         int userid = cursor.getInt(0) + 1;  
  49.         if (uriMatcher.match(uri) == 1) {  
  50.   
  51.             mysqlite.getWritableDatabase().execSQL(  
  52.                     "insert into user_info values(?,?,?)",  
  53.                     new String[] { String.valueOf(userid), name, age });  
  54.         }  
  55.         return uri;  
  56.     }  
  57.   
  58.     // 连接数据库  
  59.     @Override  
  60.     public boolean onCreate() {  
  61.         mysqlite = new MySqlite(getContext(), "userinfo.db"null1);  
  62.         return true;  
  63.     }  
  64.     //查询数据  
  65.     @Override  
  66.     public Cursor query(Uri uri, String[] projection, String selection,  
  67.             String[] selectionArgs, String sortOrder) {  
  68.         SQLiteDatabase sqlite = mysqlite.getReadableDatabase();  
  69.         String str = "select name,age from user_info";  
  70.         if (uriMatcher.match(uri) == 1) {  
  71.             str += " where " + selection;  
  72.         }  
  73.         Cursor cursor = sqlite.rawQuery(str, selectionArgs);  
  74.         return cursor;  
  75.     }  
  76.     //修改数据  
  77.     @Override  
  78.     public int update(Uri uri, ContentValues values, String selection,  
  79.             String[] selectionArgs) {  
  80.         SQLiteDatabase sqlite = mysqlite.getReadableDatabase();  
  81.         int number = 0;  
  82.         if (uriMatcher.match(uri) == 1) {  
  83.             number = sqlite.update("user_info", values, selection,  
  84.                     selectionArgs);  
  85.         }  
  86.         return number;  
  87.     }  
  88.   
  89. }  


 

   FirstContentProvider.java
  1. package com.android.xiong.conentprovidertesta;  
  2.   
  3. import android.content.ContentProvider;  
  4. import android.content.ContentValues;  
  5. import android.content.UriMatcher;  
  6. import android.database.Cursor;  
  7. import android.database.sqlite.SQLiteDatabase;  
  8. import android.net.Uri;  
  9.   
  10. public class FirstContentProvider extends ContentProvider {  
  11.   
  12.     // UriMatcher类主要用来匹配Uri  
  13.     private static final UriMatcher uriMatcher = new UriMatcher(  
  14.             UriMatcher.NO_MATCH);  
  15.     private MySqlite mysqlite;  
  16.     static {  
  17.         // 注册向外部程序提供的Uri  
  18.         uriMatcher.addURI(UserInfo.AUTOR, "userinfo"1);  
  19.         uriMatcher.addURI(UserInfo.AUTOR, "userinfoall"2);  
  20.     }  
  21.     //删除数据  
  22.     @Override  
  23.     public int delete(Uri uri, String selection, String[] selectionArgs) {  
  24.         int number = 0;  
  25.         if (uriMatcher.match(uri) == 1) {  
  26.             // 根据条件删除数据,并获取删除的行数  
  27.             number = mysqlite.getReadableDatabase().delete("user_info",  
  28.                     selection, selectionArgs);  
  29.         }  
  30.         // 通知数据已经改变  
  31.         getContext().getContentResolver().notifyChange(uri, null);  
  32.         return number;  
  33.     }  
  34.   
  35.     @Override  
  36.     public String getType(Uri uri) {  
  37.   
  38.         return null;  
  39.     }  
  40.     //插入数据  
  41.     @Override  
  42.     public Uri insert(Uri uri, ContentValues values) {  
  43.         String name = values.getAsString(UserInfo.User.NAME).toString();  
  44.         String age = values.getAsInteger(UserInfo.User.AGE).toString();  
  45.         String maxId = "select max(id) id from user_info";  
  46.         Cursor cursor = mysqlite.getReadableDatabase().rawQuery(maxId, null);  
  47.         cursor.moveToFirst();  
  48.         int userid = cursor.getInt(0) + 1;  
  49.         if (uriMatcher.match(uri) == 1) {  
  50.   
  51.             mysqlite.getWritableDatabase().execSQL(  
  52.                     "insert into user_info values(?,?,?)",  
  53.                     new String[] { String.valueOf(userid), name, age });  
  54.         }  
  55.         return uri;  
  56.     }  
  57.   
  58.     // 连接数据库  
  59.     @Override  
  60.     public boolean onCreate() {  
  61.         mysqlite = new MySqlite(getContext(), "userinfo.db"null1);  
  62.         return true;  
  63.     }  
  64.     //查询数据  
  65.     @Override  
  66.     public Cursor query(Uri uri, String[] projection, String selection,  
  67.             String[] selectionArgs, String sortOrder) {  
  68.         SQLiteDatabase sqlite = mysqlite.getReadableDatabase();  
  69.         String str = "select name,age from user_info";  
  70.         if (uriMatcher.match(uri) == 1) {  
  71.             str += " where " + selection;  
  72.         }  
  73.         Cursor cursor = sqlite.rawQuery(str, selectionArgs);  
  74.         return cursor;  
  75.     }  
  76.     //修改数据  
  77.     @Override  
  78.     public int update(Uri uri, ContentValues values, String selection,  
  79.             String[] selectionArgs) {  
  80.         SQLiteDatabase sqlite = mysqlite.getReadableDatabase();  
  81.         int number = 0;  
  82.         if (uriMatcher.match(uri) == 1) {  
  83.             number = sqlite.update("user_info", values, selection,  
  84.                     selectionArgs);  
  85.         }  
  86.         return number;  
  87.     }  
  88.   
  89. }  

MySqlite.java

  

  1. package com.android.xiong.conentprovidertesta;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class MySqlite extends SQLiteOpenHelper {  
  9.   
  10.     static final String sql = "create table user_info(id int,name varchar(30),age int)";  
  11.   
  12.     public MySqlite(Context context, String name, CursorFactory factory,  
  13.             int version) {  
  14.         super(context, name, factory, version);  
  15.         // TODO Auto-generated constructor stub  
  16.     }  
  17.   
  18.     @Override  
  19.     public void onCreate(SQLiteDatabase db) {  
  20.         //创建数据表  
  21.         db.execSQL(sql);  
  22.   
  23.     }  
  24.   
  25.     @Override  
  26.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  27.         // TODO Auto-generated method stub  
  28.   
  29.     }  
  30.   
  31. }  

MainActivity.java

  

  1. package com.android.xiong.conentprovidertesta;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7.   
  8. public class MySqlite extends SQLiteOpenHelper {  
  9.   
  10.     static final String sql = "create table user_info(id int,name varchar(30),age int)";  
  11.   
  12.     public MySqlite(Context context, String name, CursorFactory factory,  
  13.             int version) {  
  14.         super(context, name, factory, version);  
  15.         // TODO Auto-generated constructor stub  
  16.     }  
  17.   
  18.     @Override  
  19.     public void onCreate(SQLiteDatabase db) {  
  20.         //创建数据表  
  21.         db.execSQL(sql);  
  22.   
  23.     }  
  24.   
  25.     @Override  
  26.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  27.         // TODO Auto-generated method stub  
  28.   
  29.     }  
  30.   
  31. }  

activity_main.xml
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/txt1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:gravity="center_horizontal"  
  13.         android:text="添加信息"  
  14.         android:textSize="20dp" />  
  15.   
  16.     <EditText  
  17.         android:id="@+id/ed1"  
  18.         android:layout_width="match_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:hint="添加name" />  
  21.   
  22.     <EditText  
  23.         android:id="@+id/ed2"  
  24.         android:layout_width="match_parent"  
  25.         android:layout_height="wrap_content"  
  26.         android:hint="添加age"  
  27.         android:inputType="number" />  
  28.   
  29.     <Button  
  30.         android:id="@+id/bt1"  
  31.         android:layout_width="match_parent"  
  32.         android:layout_height="wrap_content"  
  33.         android:text="提交数据" />  
  34.   
  35.         <ListView  
  36.             android:id="@+id/lists"  
  37.             android:layout_width="match_parent"  
  38.             android:layout_height="wrap_content" >  
  39.         </ListView>  
  40.   
  41.   
  42. </LinearLayout>  
item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.     <TextView   
  7.         android:id="@+id/item_txt1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"/>  
  10.         <TextView   
  11.         android:id="@+id/item_txt2"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"/>  
  14.       
  15.   
  16. </LinearLayout>  


B程序

 UserInfo.java
  1. package com.android.xiong.contentprovidertestb;  
  2.   
  3. //向外部程序提供一个工具类  
  4. public class UserInfo {  
  5.   
  6.     // 获取ContentProvider的“域名”  
  7.     public static final String AUTOR = "com.android.xiong.ConentProviderTestA.firstContentProvider";  
  8.       
  9.     //定义一个静态内部类,提供ContentProvider可操作的列  
  10.     public static final class User  {  
  11.           
  12.         public  static final  String ID="id";  
  13.         public static final String NAME="name";  
  14.         public static final String AGE="age";  
  15.         //定义该content提供服务的一个Uri  
  16.         public static final String uri="content://"+AUTOR+"/userinfo";  
  17.         public static final String uriall="content://"+AUTOR+"/userinfoall";  
  18.           
  19.     }  
  20.   
  21. }  

MainActivity.java

 

  1. package com.android.xiong.contentprovidertestb;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import android.app.Activity;  
  9. import android.content.ContentValues;  
  10. import android.database.Cursor;  
  11. import android.net.Uri;  
  12. import android.os.Bundle;  
  13. import android.view.Menu;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.EditText;  
  18. import android.widget.ListView;  
  19. import android.widget.ScrollView;  
  20. import android.widget.SimpleAdapter;  
  21. import android.widget.Toast;  
  22.   
  23. public class MainActivity extends Activity {  
  24.   
  25.     private Button bt1, bt2, bt3, bt4;  
  26.     private EditText ed1, ed2;  
  27.     private ListView list1;  
  28.     private ScrollView sc1;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.         bt1 = (Button) findViewById(R.id.bt1);  
  35.         bt2 = (Button) findViewById(R.id.bt2);  
  36.         bt3 = (Button) findViewById(R.id.bt3);  
  37.         bt4 = (Button) findViewById(R.id.bt4);  
  38.         ed1 = (EditText) findViewById(R.id.ed1);  
  39.         ed2 = (EditText) findViewById(R.id.ed2);  
  40.         list1 = (ListView) findViewById(R.id.list);  
  41.         // 显示所有数据  
  42.         list1.setAdapter(adapter(0));  
  43.         sc1 = (ScrollView) findViewById(R.id.scr1);  
  44.         // 向添加ContentProviderA应用的数据  
  45.         bt1.setOnClickListener(new OnClickListener() {  
  46.   
  47.             @Override  
  48.             public void onClick(View v) {  
  49.                 String eds1 = ed1.getText().toString();  
  50.                 String eds2 = ed2.getText().toString();  
  51.                 ContentValues content = new ContentValues();  
  52.                 if (!eds1.equals("") && !eds2.equals("")) {  
  53.                     content.put(UserInfo.User.NAME, eds1);  
  54.                     content.put(UserInfo.User.AGE, eds2);  
  55.                     MainActivity.this.getContentResolver().insert(  
  56.                             Uri.parse(UserInfo.User.uri), content);  
  57.                     Toast.makeText(MainActivity.this"数据插入成功",  
  58.                             Toast.LENGTH_LONG).show();  
  59.                     // 刷新ListView界面  
  60.                     list1.setAdapter(adapter(0));  
  61.                 } else {  
  62.                     Toast.makeText(MainActivity.this"name和age不能为空",  
  63.                             Toast.LENGTH_LONG).show();  
  64.                 }  
  65.   
  66.             }  
  67.         });  
  68.         // 根据条件删除ContentProviderA应用的数据  
  69.         bt2.setOnClickListener(new OnClickListener() {  
  70.   
  71.             @Override  
  72.             public void onClick(View v) {  
  73.                 String eds1 = ed1.getText().toString();  
  74.                 String eds2 = ed2.getText().toString();  
  75.                 if (!eds1.equals("") || !eds2.equals("")) {  
  76.                     HashMap<String, String[]> wheres = wheres(eds1, eds2);  
  77.                     String sql = wheres.get("sql")[0];  
  78.                     String[] selectags = wheres.get("selectages");  
  79.                     MainActivity.this.getContentResolver().delete(  
  80.                             Uri.parse(UserInfo.User.uri), sql, selectags);  
  81.   
  82.                 } else {  
  83.                     Toast.makeText(MainActivity.this"请输入删除条件",  
  84.                             Toast.LENGTH_LONG).show();  
  85.                 }  
  86.                 // 刷新ListView界面  
  87.                 list1.setAdapter(adapter(0));  
  88.             }  
  89.         });  
  90.         // 修改数据  
  91.         bt3.setOnClickListener(new OnClickListener() {  
  92.   
  93.             @Override  
  94.             public void onClick(View v) {  
  95.                 String eds1 = ed1.getText().toString();  
  96.                 String eds2 = ed2.getText().toString();  
  97.                 ContentValues values = new ContentValues();  
  98.                 // 根据条件将列修改为xiong,23  
  99.                 values.put(UserInfo.User.NAME, "xiong");  
  100.                 values.put(UserInfo.User.AGE, "23");  
  101.                 if (!eds1.equals("") || !eds2.equals("")) {  
  102.                     HashMap<String, String[]> wheres = wheres(eds1, eds2);  
  103.                     String sql = wheres.get("sql")[0];  
  104.                     String[] selectags = wheres.get("selectages");  
  105.                     int i=MainActivity.this.getContentResolver().update(  
  106.                             Uri.parse(UserInfo.User.uri), values, sql,  
  107.                             selectags);  
  108.   
  109.                 } else {  
  110.                     Toast.makeText(MainActivity.this"请输入删除条件",  
  111.                             Toast.LENGTH_LONG).show();  
  112.                 }  
  113.                 // 刷新ListView界面  
  114.                 list1.setAdapter(adapter(0));  
  115.   
  116.             }  
  117.         });  
  118.         // 根据条件查询ContentProviderA应用的数据  
  119.         bt4.setOnClickListener(new OnClickListener() {  
  120.             @Override  
  121.             public void onClick(View v) {  
  122.                 if (!ed1.getText().toString().equals("")  
  123.                         || !ed2.getText().toString().equals(""))  
  124.                     list1.setAdapter(adapter(1));  
  125.                 else  
  126.                     list1.setAdapter(adapter(0));  
  127.             }  
  128.         });  
  129.     }  
  130.   
  131.     // 用来判别条件  
  132.     public HashMap<String, String[]> wheres(String eds1, String eds2) {  
  133.         HashMap<String, String[]> where = new HashMap<String, String[]>();  
  134.         if (!eds1.equals("") && !eds2.equals("")) {  
  135.             String[] sql = { UserInfo.User.NAME + "=? and " + UserInfo.User.AGE  
  136.                     + " =?" };  
  137.             String[] selectages = { eds1, eds2 };  
  138.             where.put("sql", sql);  
  139.             where.put("selectages", selectages);  
  140.   
  141.         }  
  142.         if (!eds1.equals("") && eds2.equals("")) {  
  143.             String[] sql = { UserInfo.User.NAME + "=? " };  
  144.             String[] selectages = { eds1 };  
  145.             where.put("sql", sql);  
  146.             where.put("selectages", selectages);  
  147.   
  148.         }  
  149.         if (eds1.equals("") && !eds2.equals("")) {  
  150.             String[] sql = { UserInfo.User.AGE + " =?" };  
  151.             String[] selectages = { eds2 };  
  152.             where.put("sql", sql);  
  153.             where.put("selectages", selectages);  
  154.   
  155.         }  
  156.         return where;  
  157.     }  
  158.   
  159.     // 用来显示数据  
  160.     public SimpleAdapter adapter(int i) {  
  161.         Cursor cs = MainActivity.this.getContentResolver().query(  
  162.                 Uri.parse(UserInfo.User.uriall), nullnullnullnull);  
  163.         String eds1 = ed1.getText().toString();  
  164.         String eds2 = ed2.getText().toString();  
  165.         if (i == 1) {  
  166.             if (!eds1.equals("") || !eds2.equals("")) {  
  167.                 HashMap<String, String[]> wheres = wheres(eds1, eds2);  
  168.                 String sql = wheres.get("sql")[0];  
  169.                 String[] selectags = wheres.get("selectages");  
  170.                 cs = MainActivity.this.getContentResolver().query(  
  171.                         Uri.parse(UserInfo.User.uri), null, sql, selectags,  
  172.                         null);  
  173.             }  
  174.   
  175.         }  
  176.   
  177.         List<Map<String, Object>> lists = new ArrayList<Map<String, Object>>();  
  178.         while (cs.moveToNext()) {  
  179.             Map<String, Object> map = new HashMap<String, Object>();  
  180.             map.put("name", cs.getString(0));  
  181.             map.put("age", cs.getString(1));  
  182.             lists.add(map);  
  183.         }  
  184.         SimpleAdapter simepl = new SimpleAdapter(MainActivity.this, lists,  
  185.                 R.layout.item, new String[] { "name""age" }, new int[] {  
  186.                         R.id.item_txt1, R.id.item_txt2 });  
  187.         return simepl;  
  188.     }  
  189.   
  190.     @Override  
  191.     public boolean onCreateOptionsMenu(Menu menu) {  
  192.         // Inflate the menu; this adds items to the action bar if it is present.  
  193.         getMenuInflater().inflate(R.menu.main, menu);  
  194.         return true;  
  195.     }  
  196.   
  197. }  
activity.xml
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <ScrollView  
  9.         android:id="@+id/scr1"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content" >  
  12.   
  13.         <LinearLayout  
  14.             android:layout_width="match_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:orientation="vertical" >  
  17.   
  18.             <Button  
  19.                 android:id="@+id/bt1"  
  20.                 android:layout_width="match_parent"  
  21.                 android:layout_height="wrap_content"  
  22.                 android:text="添加" />  
  23.   
  24.             <Button  
  25.                 android:id="@+id/bt2"  
  26.                 android:layout_width="match_parent"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:text="删除" />  
  29.   
  30.             <Button  
  31.                 android:id="@+id/bt3"  
  32.                 android:layout_width="match_parent"  
  33.                 android:layout_height="wrap_content"  
  34.                 android:text="更改" />  
  35.   
  36.             <Button  
  37.                 android:id="@+id/bt4"  
  38.                 android:layout_width="match_parent"  
  39.                 android:layout_height="wrap_content"  
  40.                 android:text="查询" />  
  41.   
  42.             <EditText  
  43.                 android:id="@+id/ed1"  
  44.                 android:layout_width="match_parent"  
  45.                 android:layout_height="wrap_content"  
  46.                 android:hint="输入name条件进行增删改查" />  
  47.   
  48.             <EditText  
  49.                 android:id="@+id/ed2"  
  50.                 android:layout_width="match_parent"  
  51.                 android:layout_height="wrap_content"  
  52.                 android:hint="输age条件进行增删改查" />  
  53.         </LinearLayout>  
  54.     </ScrollView>  
  55.   
  56.     <ListView  
  57.         android:id="@+id/list"  
  58.         android:layout_width="match_parent"  
  59.         android:layout_height="wrap_content" >  
  60.     </ListView>  
  61.   
  62. </LinearLayout>  
item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.     <TextView   
  7.         android:id="@+id/item_txt1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"/>  
  10.         <TextView   
  11.         android:id="@+id/item_txt2"  
  12.         android:layout_width="wrap_content"  
  13.         android:layout_height="wrap_content"/>  
  14.       
  15.   
  16. </LinearLayout>  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值