Android数据存储培训课程_第1页
Android数据存储培训课程_第2页
Android数据存储培训课程_第3页
Android数据存储培训课程_第4页
Android数据存储培训课程_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android数据存储培训课程AndroidAndroid数据存储概述数据存储概述 Android数据存储主要是通过Shared Preferences、本地文件和SQLite数据库。 Android是基于Linux系统,每个用户有独立的进程,这些进程之间是不能互相访问的,如果有需要在各个用户之间共享数据,我们需要使用CotentProivder实现。 另外,ContentProvider可以提供一个统一的接口使上层调用者不用关心数据存储的细节问题。Shared PreferencesShared Preferences SharedPreferences用于简单的数据存储,是通过“name-

2、value对”的机制存储数据,可以存储一些基本的数据类型包括:Boolean,string,float,long和integer类型。 数据是存储在XML文件中的。案例案例 在文本框中输入文字,点击保存按钮,保存文字到SharedPreferences中。为了查看数据是否成功保存并持久化,可以关闭模拟器,重新启动程序后,点击“获取数据”按钮。保存数据保存数据save.setOnClickListener(new View.OnClickListener() save.setOnClickListener(new View.OnClickListener() OverrideOverridepu

3、blic void onClick(View v) public void onClick(View v) / / 存储数据到存储数据到XMLXML记录文件记录文件SharedPreferences mySharedPreferences = getSharedPreferences(SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, MODE_PRIVATE);MYPREFS, MODE_PRIVATE);/ / 获得修改所用的获得修改所用的SharedPreferencesSharedPreferenc

4、es对象对象SharedPreferences.Editor editor = mySharedPreferences.edit();SharedPreferences.Editor editor = mySharedPreferences.edit();editor.putString(TEXT_KEY, text.getText().toString();editor.putString(TEXT_KEY, text.getText().toString();/ / 确定修改确定修改editor mit();editor mit(); ););getSharedPreferencesget

5、SharedPreferences方法方法 MYPREFSMYPREFS参数是我们自己定义的参数是我们自己定义的SharedPreferences文件名,这个文件名是自定义,Android按照这个名字将数据保存成XML文件。 MODE_PRIVATEMODE_PRIVATE是数据操作模式,该模式只能是被是数据操作模式,该模式只能是被具有相同的用户具有相同的用户IDID的应用程序访问,此外还有:的应用程序访问,此外还有: MODE_WORLD_READABLEMODE_WORLD_READABLE,可以被其它所有的应用程序读,可以被其它所有的应用程序读取数据。取数据。 MODE_WORLD_WR

6、ITEABLEMODE_WORLD_WRITEABLE,可以被其它所有的应用程序,可以被其它所有的应用程序写入数据。写入数据。SharedPreferences.EditorSharedPreferences.Editor 当我们是SharedPreferences修改数据时候可以使用SharedPreferences.Editor对象。 SharedPreferences.Editor editor = mySharedPreferences.edit(); editor mit()提交修改后的数据。获得数据获得数据find.setOnClickListener(new View.OnCli

7、ckListener() find.setOnClickListener(new View.OnClickListener() Override Override public void onClick(View v) public void onClick(View v) / / 存储数据到存储数据到XMLXML记录文件记录文件SharedPreferences mySharedPreferences = getSharedPreferences(SharedPreferences mySharedPreferences = getSharedPreferences(MYPREFS, MOD

8、E_PRIVATE);MYPREFS, MODE_PRIVATE);String stringPreference;String stringPreference;stringPreference = mySharedPreferences.getString(TEXT_KEY, );stringPreference = mySharedPreferences.getString(TEXT_KEY, );text.setText(stringPreference);text.setText(stringPreference); ););SQLiteSQLite数据库数据库SQLite是一个开源

9、的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做

10、的仅仅是把它正确的编译到你的程序。SQLiteSQLite数据类型数据类型 SQLite是无类型的,这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么,对于SQLite来说对字段不指定类型是完全有效的,如: Create Table ex1(a, b, c); SQLite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型, 因为数据类型对于你和其他的程序员交流, 或者你准备换掉你的数据库引擎。 SQLite支持常见的数据类型, 如:CREATE TABLE ex2( a VARCHAR(10), b NVARCHAR(

11、15), c TEXT, d INTEGER, e FLOAT, f BOOLEAN, g CLOB, h BLOB, i TIMESTAMP, j NUMERIC(10,5) k VARYING CHARACTER (24), l NATIONAL VARYING CHARACTER(16); 创建表创建表 CREATE TABLE语句CREATE TABLE Table_Name(column_name datatype(size),column_name datatype(size), ) 关系数据类型关系数据类型 字符串数据 数字数据 时间数据 大型对象字符串数据字符串数据 固定长度

12、固定长度的字段总是占据等量的内存空间,不管实际上在它们中间存放的数据量有多少。 可变长度 而可变长度的字符串只占据它们的内容所消耗的内存量,不管它们的最大尺寸是多少。字符串数据示例字符串数据示例CREATE TABLE Studios(name CHAR(20), city VARCHAR(50), state CHAR(2), revenue FLOAT)固定长度可变长度数字数据数字数据 多数数据库都提供至少2种数字数据类型:一种用于整数整数,另一种用于浮点数浮点数。另外还有一些数据库提供更加独特的数字类型。 整数整数 浮点数浮点数数字数据示例数字数据示例CREATE TABLE Studi

13、os(name CHAR(20), city VARCHAR(50), state CHAR(2), revenue FLOAT)数字指定键指定键 主键 每个表中只能指定一个主键 PRIMARY KEY主键示例主键示例 还可以在定义列的时候同时指定候选键和主键,以此代替在CREATE TABLE语句结尾处单独的子句中创建键。CREATE TABLE Studios(studio_id INTEGER PRIMARY KEY,name CHAR(20) UNIQUE,city VARCHAR(50),state CHAR(2)指定studio_id为主键INSERTINSERT语句语句 语法 I

14、NSERT INTO table_dame (column_list) VALUES (value_list) table_name是表名称,记录将要添加到该表中。INSERTINSERT语句语句 示例示例1 1 Studios表的INSERT语句 INSERT INTO StudiosVALUES(1,Giant,LosAngeles,CA)INSERTINSERT语句语句 示例示例2 2 Studios表中的列分别是:studio_id、name、city和state。因为这些值都按照上述顺序包括在VALUES子句中,所以INSERT语句可以正常工作。INSERT INTO Studios

15、 (city, state, name, studio_id) VALUES(Burbank, CA, MPM,2)INSERTINSERT语句语句 小结小结 在多数数据库中,表中的列都按照它们创建的顺序出现。当使用CREATE TABLE创建新的表时,列的顺序将保持为它们在原始语句中指定的顺序。 UPDATEUPDATE语句语句 UPDATE语句用来对表中现有的行作改动。UPDATE语句的结构如下: UPDATE table SET column = value,. WHERE conditionUPDATEUPDATE语句语句 UPDATE语句用来对表中现有的行作改动。UPDATE语句的结

16、构如下: UPDATE table SET column = value,. WHERE conditionUPDATEUPDATE语句语句 UPDATE语句有3个部分。第一,必须指定要更新哪一个表。该语句的第二部分是SET子句,应当指定其中要更新的列和要插入的值。最后,WHERE子句可以用来指定表中哪些行将要更新。UPDATEUPDATE语句语句 示例示例1 1 更改某工作室的城市和州的更改某工作室的城市和州的UPDATEUPDATE语句语句 UPDATE Studios SET city = New York,state = NY WHERE studio_id = 1 1 row upd

17、ated. UPDATEUPDATE语句语句 示例示例1 1 可以看到,在SET子句中,将city和state字段都进行了更改。WHERE子句表明只有studioID为1的行才能被更新。在编写只对表中某一行产生影响的UPDATE语句时,在WHERE子句中使用主关键字来确保只有一行受到改变的影响往往是一个好办法。如果忽略UPDATE语句中的WHERE子句,那么在更新表中的所有行都将受到该语句的影响。 UPDATEUPDATE语句语句 示例示例2 2 用UPDATE来更改表中所有行的语句 UPDATE StudiosSET state = AK2 rows updated.SELECT * FRO

18、M StudiosSTUDIO_ID NAME CITY STATE1 Giant New York AK2 MPM Burbank AKDELETEDELETE语句语句 DELETE语句也可以用来将记录从表中删除。DEILETE语句的结构非常简单:DELETE FROM tableWHERE conditionDELETEDELETE语句语句 可选的WHERE子句可用来限制DELETE语句删除的行数。如果忽略WHERE子句,表中所有的行都会被删除。通过使用WHERE子句,可以指定要想删除每行所必须满足的条件。DELETEDELETE语句语句 示例示例 删除Studios 表中所有的行 DEL

19、ETE FROM StudiosWHERE state = AK2 rows deleted.AndroidAndroid访问访问SQLiteSQLite 在Android访问SQLite数据库常用有两种方式: 扩展SQLiteOpenHelper类提供数据访问接口。 扩展ContentProvider类来提供数据访问接口。SQLiteOpenHelperSQLiteOpenHelper SQLiteOpenHelper类对于数据库访问能够实现很好的封装。如果我们在打开之前创建或更新数据库,可以通过实现SQLiteOpenHelper类实现这一需求。 在实现类中覆盖onCreate和onUpg

20、rade方法,以及对应的构造方法。有关数据库处理的代码片段有关数据库处理的代码片段DBHelper(Context _context) DBHelper(Context _context) super(_context, DATABASE_NAME, null, DATABASE_VERSION);super(_context, DATABASE_NAME, null, DATABASE_VERSION);context = _context;context = _context; OverrideOverridepublic void onCreate(SQLiteDatabase db)

21、public void onCreate(SQLiteDatabase db) try try db.execSQL(CREATE TABLE t_user (db.execSQL(CREATE TABLE t_user (+ _ID INTEGER PRIMARY KEY autoincrement,+ _ID INTEGER PRIMARY KEY autoincrement,+ NAME TEXT + ););+ NAME TEXT + );); catch (Exception e) catch (Exception e) OverrideOverridepublic void onU

22、pgrade(SQLiteDatabase db, int oldVersion, int newVersion) public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) db.execSQL(DROP TABLE IF EXISTS t_user);db.execSQL(DROP TABLE IF EXISTS t_user);/ Create a new one./ Create a new one.onCreate(db);onCreate(db); 有关有关UIUI的代码片段的代码片段protec

23、ted void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);super.onCreate(savedInstanceState);this.setContentView(R.layout.main);this.setContentView(R.layout.main);/ / 初始化初始化UIUIbtnAdd = (Button) findViewById(R.id.btnAdd);btnAdd

24、 = (Button) findViewById(R.id.btnAdd);btnViewAll = (Button) findViewById(R.id.btnViewAll);btnViewAll = (Button) findViewById(R.id.btnViewAll);viewAll = (TextView) findViewById(R.id.viewAll);viewAll = (TextView) findViewById(R.id.viewAll);inputTxt = (EditText) findViewById(R.id.txtInput);inputTxt = (

25、EditText) findViewById(R.id.txtInput);/ / 初始化初始化DBDBdb = new DBHelper(this);db = new DBHelper(this);/ / 初始化监听初始化监听OnClickListener listener = new OnClickListener() OnClickListener listener = new OnClickListener() public void onClick(View v) public void onClick(View v) if (v.getId() = R.id.btnAdd) if

26、(v.getId() = R.id.btnAdd) db.save(inputTxt.getText().toString();db.save(inputTxt.getText().toString(); else if (v.getId() = R.id.btnViewAll) else if (v.getId() = R.id.btnViewAll) / / 浏览所有数据浏览所有数据Cursor cur = db.loadAll();Cursor cur = db.loadAll();StringBuffer sf = new StringBuffer();StringBuffer sf

27、= new StringBuffer();cur.moveToFirst();cur.moveToFirst();while (!cur.isAfterLast() while (!cur.isAfterLast() sf.append(cur.getInt(0).append( : ).append(cur.getString(1).append(n);sf.append(cur.getInt(0).append( : ).append(cur.getString(1).append(n);cur.moveToNext();cur.moveToNext(); viewAll.setText(

28、sf.toString();viewAll.setText(sf.toString(); ;btnAdd.setOnClickListener(listener);btnAdd.setOnClickListener(listener);btnViewAll.setOnClickListener(listener);btnViewAll.setOnClickListener(listener); 小结小结 SQLiteDatabaseSQLiteDatabase void execSQL (String sql) void execSQL (String sql) ,可以执行插入、删除、,可以执

29、行插入、删除、修改和建表修改和建表sqlsql语句。语句。 Cursor query()Cursor query()实现查询。实现查询。 Cursor Cursor 返回的读取数据库查询结果集,主要方法:返回的读取数据库查询结果集,主要方法: moveToFirstmoveToFirst是将结果集指针移到第一条记录是将结果集指针移到第一条记录 isAfterLast isAfterLast 是将判断是否到达最后一条记录之后。是将判断是否到达最后一条记录之后。 moveToNextmoveToNext是将结果集指针移向后移动一条记录。是将结果集指针移向后移动一条记录。 遍历游标写法:. . .c

30、.moveToNext();c.moveToNext();while (!c.isAfterLast() while (!c.isAfterLast() . . .c.moveToNext();c.moveToNext(); . . .ContentProviderContentProvider 由于Android是基于Linux系统,每个用户有比较的进程,这些进程之间是不能互相访问的,如果有需要在各个用户之间共享数据,我们需要使用CotentProivder实现。 在Android中数据存储可以是文件系统,数据库(SQLite等),ContentProvider可以提供一个统一的接口使上层调

31、用者不用关心数据存储的细节问题。Content URIContent URIA. 标准前缀表明这个数据被一个内容提供器所控制。它不会被修改。B. URI的权限部分;它标识这个内容提供器。对于第三方应用程序,这应该是一个全称类名以确保唯一性。权限在元素的权限属性中进行声明:C. 用来判断请求数据类型的路径。这可以是0或多个段长。这个分段可以没有。D.被请求的特定记录的ID,如果有的话。这是被请求记录的_ID数值。如果这个请求不局限于单个记录, 这个分段和尾部的斜线会被忽略:provider android:name= Content URI Content URI 总结总结 content:/m

32、edia/internal/images 这个URI将返回设备上存储的所有图片 content:/contacts/people/ 这个URI将返回设备上的所有联系人信息 content:/contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)DataProviderDataProvider的代码片段的代码片段OverrideOverridepublic boolean onCreate() public boolean onCreate() mOpenHelper = new DatabaseHelper(getContext();mOpenHel

33、per = new DatabaseHelper(getContext(); return true; return true; public Uri insert(Uri uri, ContentValues values) public Uri insert(Uri uri, ContentValues values) SQLiteDatabase db = mOpenHelper.getWritableDatabase();SQLiteDatabase db = mOpenHelper.getWritableDatabase();long rowId = db.insert(TABLE_

34、NAME, null, values);long rowId = db.insert(TABLE_NAME, null, values);Log.v(TAG, insert Table t_user ok);Log.v(TAG, insert Table t_user ok);if (rowId 0) if (rowId 0) Uri insertedUri = ContentUris.withAppendedId(uri, rowId); Uri insertedUri = ContentUris.withAppendedId(uri, rowId); getContext().getCon

35、tentResolver() getContext().getContentResolver().notifyChange(insertedUri, null);.notifyChange(insertedUri, null); return insertedUri; return insertedUri; throw new SQLException(Failed to insert row into + uri);throw new SQLException(Failed to insert row into + uri); 解释解释 Uri insertedUri = ContentUr

36、is.withAppendedId(uri, rowId); 重新构建一个URI对象,如果uri是content:/contacts/people, rowId是45。重新构建的URI是content:/contacts/people/45 getContext().getContentResolver().notifyChange(insertedUri, null); notifyChange()方法则用来通知注册在此URI上的观察者(observer)数据发生了改变。最后返回删除或修改数据的行数。DataProviderDataProvider的代码片段的代码片段OverrideOver

37、ridepublic Cursor query(Uri uri, String projection, String selection,public Cursor query(Uri uri, String projection, String selection,String selectionArgs, String sortOrder) String selectionArgs, String sortOrder) SQLiteDatabase db = mOpenHelper.getReadableDatabase();SQLiteDatabase db = mOpenHelper.

38、getReadableDatabase();Cursor c = db.query(TABLE_NAME, projection, null, null, null, null, null);Cursor c = db.query(TABLE_NAME, projection, null, null, null, null, null);return c;return c; OverrideOverridepublic int update(Uri uri, ContentValues values, String where,public int update(Uri uri, Conten

39、tValues values, String where,String whereArgs) String whereArgs) String rowId = uri.getPathSegments().get(1);String rowId = uri.getPathSegments().get(1);SQLiteDatabase db = mOpenHelper.getReadableDatabase();SQLiteDatabase db = mOpenHelper.getReadableDatabase();int count = db.update(TABLE_NAME, value

40、s, _ID = + rowIdint count = db.update(TABLE_NAME, values, _ID = + rowId+ (!TextUtils.isEmpty(where) ? AND ( + where + ) : + (!TextUtils.isEmpty(where) ? AND ( + where + ) : ), whereArgs);), whereArgs);return count;return count; DataProviderDataProvider的代码片段的代码片段OverrideOverridepublic int delete(Uri

41、uri, String where, String whereArgs) public int delete(Uri uri, String where, String whereArgs) String rowId = uri.getPathSegments().get(1);String rowId = uri.getPathSegments().get(1);SQLiteDatabase db = mOpenHelper.getReadableDatabase();SQLiteDatabase db = mOpenHelper.getReadableDatabase();int coun

42、t = db.delete(TABLE_NAME, _ID = + rowIdint count = db.delete(TABLE_NAME, _ID = + rowId+ (!TextUtils.isEmpty(where) ? AND ( + where + ) : + (!TextUtils.isEmpty(where) ? AND ( + where + ) : ),whereArgs);),whereArgs);return count;return count; OverrideOverridepublic String getType(Uri uri) public Strin

43、g getType(Uri uri) return null;return null; DatabaseHelperDatabaseHelper的代码片段的代码片段private class DatabaseHelper extends SQLiteOpenHelper private class DatabaseHelper extends SQLiteOpenHelper DatabaseHelper(Context _context) DatabaseHelper(Context _context) super(_context, DATABASE_NAME, null, DATABAS

44、E_VERSION);super(_context, DATABASE_NAME, null, DATABASE_VERSION); OverrideOverridepublic void onCreate(SQLiteDatabase db) public void onCreate(SQLiteDatabase db) try try db.execSQL(CREATE TABLE t_user (db.execSQL(CREATE TABLE t_user (+ _ID INTEGER PRIMARY KEY autoincrement,+ _ID INTEGER PRIMARY KEY

45、 autoincrement,+ NAME TEXT + ););+ NAME TEXT + ););Log.v(TAG, Create Table t_user ok);Log.v(TAG, Create Table t_user ok); catch (Exception e) catch (Exception e) Log.v(TAG, Create Table t_user err,table exists.);Log.v(TAG, Create Table t_user err,table exists.);OverrideOverridepublic void onUpgrade(

46、SQLiteDatabase db, int oldVersion, int newVersion) public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) db.execSQL(DROP TABLE IF EXISTS t_user); db.execSQL(DROP TABLE IF EXISTS t_user); onCreate(db); onCreate(db);调用的调用的ActivityActivity代码片段代码片段if (v.getId() = R.id.btnAdd) if (v.ge

47、tId() = R.id.btnAdd) / / 增加增加ContentValues values = new ContentValues();ContentValues values = new ContentValues();values.put(NAME, inputId.getText().toString();values.put(NAME, inputId.getText().toString();getContentResolver().insert(CONTENT_URI, values);getContentResolver().insert(CONTENT_URI, val

48、ues);/ db.close();/ db.close(); else if (v.getId() = R.id.btnViewAll) else if (v.getId() = R.id.btnViewAll) / / 浏览所有数据浏览所有数据Cursor cur = getContentResolver().query(CONTENT_URI,Cursor cur = getContentResolver().query(CONTENT_URI, new String _ID, NAME , null, null, null);new String _ID, NAME , null, n

49、ull, null);StringBuffer sf = new StringBuffer();StringBuffer sf = new StringBuffer();cur.moveToFirst();cur.moveToFirst();while (!cur.isAfterLast() while (!cur.isAfterLast() sf.append(cur.getInt(0).append( : ).append(sf.append(cur.getInt(0).append( : ).append(cur.getString(1).append(n);cur.getString(

50、1).append(n);cur.moveToNext();cur.moveToNext(); / db.close();/ db.close();viewAll.setText(sf.toString();viewAll.setText(sf.toString(); else if (v.getId() = R.id.btnDelete) else if (v.getId() = R.id.btnDelete) / / 删除数据删除数据long selectedID = new Long(inputId.getText().toString();long selectedID = new L

51、ong(inputId.getText().toString();Uri deletedUri = ContentUris.withAppendedId(CONTENT_URI,selectedID);Uri deletedUri = ContentUris.withAppendedId(CONTENT_URI,selectedID);getContentResolver().delete(deletedUri, null, null);getContentResolver().delete(deletedUri, null, null);使用使用CursorAdapter CursorAda

52、pter 在UI部分会使用Adapter绑定ListView,CursorAdapter是将数据库查询得到的Cursor对象绑定到ListView的对象。 由于CursorAdapter是一个抽象类,所以我们可以使用自己定义的CursorAdapter,也可以使用Android SDK提供的SimpleCursorAdapter。SimpleCursorAdapterSimpleCursorAdapter构造方法构造方法 SimpleCursorAdapter(Context context, int layout, Cursor c, String from, int to) context

53、,是上下文对象 layout,布局文件的id c,数据库或的游标对象 from,数据表查询字段 to,布局文件中控件的id,它们要与from一一对应。final Cursor c = /final Cursor c = /调用查询方法获得游标对象调用查询方法获得游标对象 String from = new String People.NAME;String from = new String People.NAME;int to = new int R.id.itemTextView ;int to = new int R.id.itemTextView ; SimpleCursorAdapt

54、er adapter SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(), = new SimpleCursorAdapter(getApplicationContext(), R.layout.listitemlayout, R.layout.listitemlayout, c, from, to); c, from, to);小结小结 SimpleCursorAdapterSimpleCursorAdapter 使用的数据库表必须具有一个名字为”_id”的 INTEGER的主键字段。 _

55、id INTEGER PRIMARY KEY autoincrement SQLite中文乱码问题。byte bname = c.getBlob(1);byte bname = c.getBlob(1);String name = ;String name = ;try try name = new String(bname, GBK); name = new String(bname, GBK); catch (UnsupportedEncodingException e) catch (UnsupportedEncodingException e) e.printStackTrace();

56、 e.printStackTrace(); CursorAdapterCursorAdapter中文问题中文问题 由于SQLite中文问题也会导致SimpleCursorAdapter产生中文问题。 通过自定义CursorAdapter解决中文问题。自定义自定义CursorAdapterCursorAdapter中文问题中文问题 自定义CursorAdapter需要继承CursorAdapter抽象类,需要重新newView 和bindView方法。 newView方法,创建一个View。 bindView方法,把Cursor中的数据绑定到ListView中,我们要在这个方法中实现中文转换。构

57、造方法构造方法public GBKCursorAdapter(Context context, int layout_listitem,public GBKCursorAdapter(Context context, int layout_listitem, Cursor c, String cols, Class clz, int itemviews) Cursor c, String cols, Class clz, int itemviews) super(context, c);super(context, c);this.mInflater = LayoutInflater.from(context);this.mInflater = LayoutInflater.from(context);this.layout_listitem = layout_listitem;this.layout_listitem = layout_listitem;this.clz = clz; /this.clz = clz; /字段的类型字段的类型this.cols

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论