有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常。同时该方法同样适合于其他需要检测资源泄露的情况。 最近发现某蔬菜手机连接程序在查询媒体存储(MediaProvider)数据库时出现严重 Cursor 泄漏现象,运行一段时间后会导致系统中所有使用到该数据库的程序无法使用。另外在工作中也常发现有些应用有 Cursor 泄漏现象,由于需要长时间运行才会出现异常,所以有的此类 bug 很长时间都没被发现。但是一旦 Cursor 泄漏累计到一定数目(通常为数百个)必然会出现无法查询数据库的情况,只有等数据库服务所在进程死掉重启才能恢复正常。通常的出错信息如下,指出某 pid 的程序打开了 866 个 Cursor 没有关闭,导致了 exception:3634 3644 E JavaBinder: Uncaught remote exception! (Exceptions are not yet supported across processes) 3634 3644 E JavaBinder: androiddatabaseCursorWindowAllocationException: Cursor window allocation of 2048 kb failed # Open Cursors=866 (# cursors opened by pid 1565=866) 3634 3644 E JavaBinder: at androiddatabaseCursorWindow(CursorWindowjava:104) 3634 3644 E JavaBinder: at androiddatabaseAbstractWindowedCursorclearOrCreateWindow(AbstractWindowedCursorjava:198) 3634 3644 E JavaBinder: at androiddatabasesqliteSQLiteCursorfillWindow(SQLiteCursorjava:147) 3634 3644 E JavaBinder: at androiddatabasesqliteSQLiteCursorgetCount(SQLiteCursorjava:141) 3634 3644 E JavaBinder: at androiddatabaseCursorToBulkCursorAdaptorgetBulkCursorDescriptor(CursorToBulkCursorAdaptorjava:143) 3634 3644 E JavaBinder: at androidcontentContentProviderNativeonTransact(ContentProviderNativejava:118) 3634 3644 E JavaBinder: at androidosBinderexecTransact(Binderjava:367) 3634 3644 E JavaBinder: at dalviksystemNativeStartrun(Native Method) 1 Cursor 检测原理在Cursor 对象被 JVM 回收运行到 finalize() 方法的时候,检测 close() 方法有没有被调用,此办法在 ContentResolver 里面也得到应用。简化后的示例代码如下: 1import androiddatabaseCursor; 2import androiddatabaseCursorWrapper; 3import androidutilLog; 4 5publicclass TestCursor extends CursorWrapper { 6privatestaticfinal String TAG = "TestCursor"; 7privateboolean mIsClosed = false; 8private Throwable mTrace; 910public TestCursor(Cursor c) { 11super(c); 12 mTrace = new Throwable("Explicit termination method 'close()' not called"); 13 } 1415 @Override 16publicvoid close() { 17 mIsClosed = true; 18 } 1920 @Override 21publicvoid finalize() throws Throwable { 22try { 23if (mIsClosed != true) { 24 Loge(TAG, "Cursor leaks", mTrace); 25 } 26 } finally { 27superfinalize(); 28 } 29 } 30 }然后查询的时候,把 TestCursor 作为查询结果返回给 APP:1returnnew TestCursor(cursor); // cursor 是普通查询得到的结果,例如从 ContentProviderquery() 该方法同样适合于所有需要检测显式释放资源方法没有被调用的情形,是一种通用方法。但在 finalize() 方法里检测需要注意优点:准确。因为该资源在 Cursor 对象被回收时仍没被释放,肯定是发生了资源泄露。缺点:依赖于 finalize() 方法,也就依赖于 JVM 的垃圾回收策略。例如某 APP 现在有 10 个 Cursor 对象泄露,并且这 10 个对象已经不再被任何引用指向处于可回收状态,但是 JVM 可能并不会马上回收(时间不可预测),如果你现在检查不能够发现问题。另外,在某些情况下就算对象被回收 finalize() 可能也不会执行,也就是不能保证检测出所有问题。关于 finalize() 更多信息可以参考《Effective Java 2nd Edition》的 Item 7: Avoid Finalizers2 使用方法对于APP 开发人员从GINGERBREAD 开始 Android 就提供了 StrictMode 工具协助开发人员检查是否不小心地做了一些不该有的 *** 作。使用方法是在 Activity 里面设置 StrictMode,下面的例子是打开了检查泄漏的 SQLite 对象以及 Closeable 对象(普通 Cursor/FileInputStream 等)的功能,发现有违规情况则记录 log 并使程序强行退出。 1import androidosStrictMode; 2 3publicclass TestActivity extends Activity { 4privatestaticfinalboolean DEVELOPER_MODE = true; 5publicvoid onCreate() { 6if (DEVELOPER_MODE) { 7 StrictModesetVMPolicy(new StrictModeVMPolicyBuilder() 8 detectLeakedSqlLiteObjects() 9 detectLeakedClosableObjects() 10 penaltyLog() 11 penaltyDeath() 12 build()); 13 } 14superonCreate(); 15 } 16 } 对于framework 开发人员如果是通过 ContentProvider 提供数据库数据,在 ContentResolver 里面已有 CloseGuard 类实行类似检测,但需要自行打开(上例也是打开 CloseGuard):1 CloseGuardsetEnabled(true);更值得推荐的办法是按照本文第一节中的检测原理,在 ContentResolver 内部类 CursorWrapperInner 里面加入。其他需要检测类似于资源泄漏的,同样可以使用该检测原理。3 容易出错的地方忘记调用 close() 这种低级错误没什么好说的,这种应该也占不小的比例。下面说说不太明显的例子。提前返回有时候粗心会犯这种错误,在 close() 调用之前就 return 了,特别是函数比较大逻辑比较复杂时更容易犯错。这种情况可以通过把 close() 放在 finally 代码块解决1privatevoid method() { 2 Cursor cursor = query(); // 假设query() 是一个查询数据库返回 Cursor 结果的函数3if (flag == false) { //!!提前返回4return; 5 } 6 cursorclose(); 7 } 类的成员变量假设类里面有一个在类全局有效的成员变量,在方法 A 获取了查询结果,后面在其他地方又获取了一次查询结果,那么第二次查询的时候就应该先把前面一个 Cursor 对象关闭。 1publicclass TestCursor { 2private Cursor mCursor; 3 4privatevoid methodA() { 5 mCursor = query(); 6 } 7 8privatevoid methodB() { 9//!!必须先关闭上一个 cursor 对象10 mCursor = query(); 11 } 12 }注意:曾经遇到过有人对 mCursor 感到疑惑,明明是同一个变量为什么还需要先关闭?首先 mCursor 是一个 Cursor 对象的引用,在 methodA 时 mCursor 指向了 query() 返回的一个 Cursor 对象 1;在 methodB() 时它又指向了返回的另外一个 Cursor 对象 2。在指向 Cursor 对象 2 之前必须先关闭 Cursor 对象 1,否则就出现了 Cursor 对象 1 在 finalize() 之前没有调用 close() 的情况。异常处理打开和关闭 Cursor 之间的代码出现 exception,导致没有跑到关闭的地方:1try { 2 Cursor cursor = query(); 3// 中间省略某些出现异常的代码4 cursorclose(); 5 } catch (Exception e) { 6//!!出现异常没跑到 cursorclose()7 }这种情况应该把 close() 放到 finally 代码块里面: 1 Cursor cursor = null; 2try { 3 cursor = query(); 4// 中间省略某些出现异常的代码 5 } catch (Exception e) { 6// 出现异常 7 } finally { 8if (cursor != null) 9 cursorclose(); 10 }4 总结思考在finalize() 里面检测是可行的,且基本可以满足需要。针对 finalize() 执行时间不确定以及可能不执行的问题,可以通过记录目前打开没关闭的 Cursor 数量来部分解决,超过一定数目发出警告,两种手段相结合。还有没有其他检测办法呢?有,在 Cursor 构造方法以及 close() 方法添加 log,运行一段时间后检查 log 看哪个地方没有关闭。简化代码如下: 1import androiddatabaseCursor; 2import androiddatabaseCursorWrapper; 3import androidutilLog; 4 5publicclass TestCursor extends CursorWrapper { 6privatestaticfinal String TAG = "TestCursor"; 7private Throwable mTrace; 8 9public TestCursor(Cursor c) { 10super(c); 11 mTrace = new Throwable("cusor opened here"); 12 Logd(TAG, "Cursor " + thishashCode() + " opened, stacktrace is: ", mTrace); 13 } 1415 @Override 16publicvoid close() { 17 mIsClosed = true; 18 Logd(TAG, "Cursor " + thishashCode() + " closed"); 19 } 20 }检查时看某个 hashCode() 的 Cursor 有没有调用过 close() 方法,没有的话说明资源有泄露。这种方法优点是同样准确,且更可靠。
android如何获取联络人所有资讯 获取联络人必须新增许可权
<uses-permission android:name="androidpermissionREAD_CONTACTS" />
如何获取手机联络人资讯
根据ContactsContractContactsCONTENT_URI查询ContentResolver里面的资料,逐个取值即可。
如何获取sim卡的联络人资讯
根据目前查询的资讯来看,sim联络人的uri有两种:
content:i/adn
content:sim/adn
挨个去取即可。
如何获取联络人所有栏位
package ihopemozyhomeutil;import javautilArrayList;import javautilList;import jsonJSONException;import jsonJSONObject;import androidcontentContext;import androiddatabaseCursor;import androidproviderContactsContractCommonDataKindsEmail;import androidproviderContactsContractCommonDataKindsEvent;import androidproviderContactsContractCommonDataKindsIm;import androidproviderContactsContractCommonDataKindsNickname;import androidproviderContactsContractCommonDataKindsNote;import androidproviderContactsContractCommonDataKindsOrganization;import androidproviderContactsContractCommonDataKindsPhone;import androidproviderContactsContractCommonDataKindsStructuredName;import androidproviderContactsContractCommonDataKindsStructuredPostal;import androidproviderContactsContractCommonDataKindsWebsite;import androidproviderContactsContractData;import androidutilLog;import ihopemozyhomedomainContacts;public class GetContactsInfo {private List<Contacts> list;private Context context;private JSONObject contactData;private JSONObject jsonObject;public GetContactsInfo(Context context) { thiscontext = context;}public String getContactInfo() throws JSONException { 获得通讯录资讯 ,URI是ContactsContractContactsCONTENT_URI list = new ArrayList<Contacts>(); contactData = new JSONObject(); String mimetype = ""; int oldrid = -1; int contactId = -1; Cursor cursor = contextgetContentResolver()query(DataCONTENT_URI,null, null, null, DataRAW_CONTACT_ID); int numm=0; while (cursormoveToNext()) { contactId = cursorgetInt(cursorgetColumnIndex(DataRAW_CONTACT_ID)); if (oldrid != contactId) { jsonObject = new JSONObject(); contactDataput("contact" + numm, jsonObject); numm++; oldrid = contactId; } 取得mimetype型别 mimetype = cursorgetString(cursorgetColumnIndex(DataMIMETYPE)); 获得通讯录中每个联络人的ID 获得通讯录中联络人的名字 if (StructuredNameCONTENT_ITEM_TYPEequals(mimetype)) { String display_name = cursorgetString(cursorgetColumnIndex(StructuredNameDISPLAY_NAME)); String prefix = cursorgetString(cursorgetColumnIndex(StructuredNamePREFIX)); jsonObjectput("prefix", prefix); String firstName = cursorgetString(cursorgetColumnIndex(StructuredNameFAMILY_NAME)); jsonObjectput("firstName", firstName); String middleName = cursorgetString(cursorgetColumnIndex(StructuredNameMIDDLE_NAME)); jsonObjectput("middleName", middleName); String lastname = cursorgetString(cursorgetColumnIndex(StructuredNameGIVEN_NAME)); jsonObjectput("lastname", lastname); String suffix = cursorgetString(cursorgetColumnIndex(StructuredNameSUFFIX)); jsonObjectput("suffix", suffix); String phoicFirstName = cursorgetString(cursorgetColumnIndex(StructuredNamePHONETIC_FAMILY_NAME)); jsonObjectput("phoicFirstName", phoicFirstName); String phoicMiddleName = cursorgetString(cursorgetColumnIndex(StructuredNamePHONETIC_MIDDLE_NAME)); jsonObjectput("phoicMiddleName", phoicMiddleName); String phoicLastName = cursorgetString(cursorgetColumnIndex(StructuredNamePHONETIC_GIVEN_NAME)); jsonObjectput("phoicLastName", phoicLastName); } 获取电话资讯 if (PhoneCONTENT_ITEM_TYPEequals(mimetype)) { 取出电话型别 int phoneType = cursorgetInt(cursorgetColumnIndex(PhoneTYPE)); 手机 if (phoneType == PhoneTYPE_MOBILE) { String mobile = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("mobile", mobile); } 住宅电话 if (phoneType == PhoneTYPE_HOME) { String homeNum = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("homeNum", homeNum); } 单位电话 if (phoneType == PhoneTYPE_WORK) { String jobNum = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("jobNum", jobNum); } 单位传真 if (phoneType == PhoneTYPE_FAX_WORK) { String workFax = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("workFax", workFax); } 住宅传真 if (phoneType == PhoneTYPE_FAX_HOME) { String homeFax = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("homeFax", homeFax); } 寻呼机 if (phoneType == PhoneTYPE_PAGER) { String pager = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("pager", pager); } 回拨号码 if (phoneType == PhoneTYPE_CALLBACK) { String quickNum = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("quickNum", quickNum); } 公司总机 if (phoneType == PhoneTYPE_COMPANY_MAIN) { String jobTel = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("jobTel", jobTel); } 车载电话 if (phoneType == PhoneTYPE_CAR) { String carNum = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("carNum", carNum); } ISDN if (phoneType == PhoneTYPE_ISDN) { String isdn = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("isdn", isdn); } 总机 if (phoneType == PhoneTYPE_MAIN) { String tel = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("tel", tel); } 无线装置 if (phoneType == PhoneTYPE_RADIO) { String wirelessDev = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("wirelessDev", wirelessDev); } 电报 if (phoneType == PhoneTYPE_TELEX) { String telegram = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("telegram", telegram); } TTY_TDD if (phoneType == PhoneTYPE_TTY_TDD) { String tty_tdd = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("tty_tdd", tty_tdd); } 单位手机 if (phoneType == PhoneTYPE_WORK_MOBILE) { String jobMobile = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("jobMobile", jobMobile); } 单位寻呼机 if (phoneType == PhoneTYPE_WORK_PAGER) { String jobPager = cursorgetString(cursorgetColumnIndex(PhoneNUMBER)); jsonObjectput("jobPager", jobPager); } 其他通讯地址 if (postalType == StructuredPostalTYPE_OTHER) { String otherStreet = cursorgetString(cursorgetColumnIndex(StructuredPostalSTREET)); jsonObjectput("otherStreet", otherStreet); String otherCity = cursorgetString(cursorgetColumnIndex(StructuredPostalCITY)); jsonObjectput("otherCity", otherCity); String otherBox = cursorgetString(cursorgetColumnIndex(StructuredPostalPOBOX)); jsonObjectput("otherBox", otherBox); String otherArea = cursorgetString(cursorgetColumnIndex(StructuredPostalNEIGHBORHOOD)); jsonObjectput("otherArea", otherArea); String otherState = cursorgetString(cursorgetColumnIndex(StructuredPostalREGION)); jsonObjectput("otherState", otherState); String otherZip = cursorgetString(cursorgetColumnIndex(StructuredPostalPOSTCODE)); jsonObjectput("otherZip", otherZip); String otherCountry = cursorgetString(cursorgetColumnIndex(StructuredPostalCOUNTRY)); jsonObjectput("otherCountry", otherCountry); } } } cursorclose(); Logi("contactData", contactDatatoString()); return contactDatatoString();}}
拍拍贷如何获取联络人
拍拍贷app 可以获取你的通讯录,新浪有借也一样
而且更加好用
它的话是利息按日计,随时还款。
而一般的网贷如借10000,按照目前不低的年化收益率10%来计算的话, 一个月利息是83左右。 计算公式你记一下 10000x10%=1000(这里得出的是一年的收益) 1000/12=83 (除以12个月,才得到你一个月的)
微锁屏获取联络人资讯有风险吗
国内的很多软体都申请了很多不需要的许可权,锁屏软体应该是不需要读取联络人资讯的,可以安装一些软体取消锁屏软体的读取联络人许可权。
android怎么获取联络人头像
必须先编辑成正方形,或你的联络人有自动减取功能,不然头像肯定变形!
手机常显示易信正在尝试获取联络人资讯
这应该是易信在读取你的联络人,以便获取已经用手机号码注册了易信的手机上的联络人,可以考虑解除安装易信(如果不经常用的话)其实很多软体都喜欢读取个人资讯。。
为什么百度HI新增联络人时总是正在获取联络人资讯
应该是网速慢,如果你确定你的网速正常,那有可能是百度系统出错了。
我也遇到过这种情况。
还有一种可能,就是你新增的联络人不存在,或名字输入错误。
什么软体可以汇出联络人所有资讯
360手机卫士、qq都提供了云端备份通讯录的功能。现在备份到云端伺服器上是最安全的,永远不会丢失,换手机前备份一下,新手机上就可以下载到。平日经常备份联络人资讯,安全可靠有保障。
android开发怎样获取通讯录联络人资讯
public class ContactsActivity extends ListActivity {
Context mContext = null;
/获取库Phon表字段/
private static final String[] PHONES_PROJECTION = new String[] {
PhoneDISPLAY_NAME, PhoneNUMBER, PhotoPHOTO_ID,PhoneCONTACT_ID };
/联络人显示名称/
private static final int PHONES_DISPLAY_NAME_INDEX = 0;
/电话号码/
private static final int PHONES_NUMBER_INDEX = 1;
/头像ID/
private static final int PHONES_PHOTO_ID_INDEX = 2;
/联络人的ID/
private static final int PHONES_CONTACT_ID_INDEX = 3;
/联络人名称/
private ArrayList<String> mContactsName = new ArrayList<String>();
/联络人头像/
private ArrayList<String> mContactsNumber = new ArrayList<String>();
/联络人头像/
private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();
ListView mListView = null;
MyListAdapter myAdapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = this;
mListView = thisgetListView();
/得到手机通讯录联络人资讯/
getPhoneContacts();
myAdapter = new MyListAdapter(this);
setListAdapter(myAdapter);
mListViewsetOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<> adapterView, View view,
int position, long id) {
呼叫系统方法拨打电话
Intent dialIntent = new Intent(IntentACTION_CALL, Uri
parse("tel:" + mContactsNumberget(position)));
startActivity(dialIntent);
}
});
superonCreate(savedInstanceState);
}
/得到手机通讯录联络人资讯/
private void getPhoneContacts() {
ContentResolver resolver = mContextgetContentResolver();
获取手机联络人
Cursor phoneCursor = resolverquery(PhoneCONTENT_URI,PHONES_PROJECTION, null, null, null);
if (phoneCursor != null) {
while (phoneCursormoveToNext()) {
得到手机号码
String phoneNumber = phoneCursorgetString(PHONES_NUMBER_INDEX);
当手机号码为空的或者为空栏位 跳过当前回圈
if (TextUtilsisEmpty(phoneNumber))
continue;
得到联络人名称
String contactName = phoneCursorgetString(PHONES_DISPLAY_NAME_INDEX);
得到联络人ID
Long contactid = phoneCursorgetLong(PHONES_CONTACT_ID_INDEX);
得到联络人头像ID
Long photoid = phoneCursorgetLong(PHONES_PHOTO_ID_INDEX);
得到联络人头像Bitamp
Bitmap contactPhoto = null;
photoid 大于0 表示联络人有头像 如果没有给此人设定头像则给他一个预设的
if(photoid > 0 ) {
Uri uri =ContentUriswithAppendedId(ContactsContractContactsCONTENT_URI,contactid);
InputStream input = ContactsContractContactsopenContactPhotoInputStream(resolver, uri);
contactPhoto = BitmapFactorydecodeStream(input);
}else {
contactPhoto = BitmapFactorydecodeResource(getResources(), Rdrawablecontact_photo);
}
mContactsNameadd(contactName);
mContactsNumberadd(phoneNumber);
mContactsPhontoadd(contactPhoto);
}
phoneCursorclose();
}
}
/得到手机SIM卡联络人人资讯/
private void getSIMContacts() {
ContentResolver resolver = mContextgetContentResolver();
获取Sims卡联络人
Uri uri = Uriparse("content:i/adn");
Cursor phoneCursor = resolverquery(uri, PHONES_PROJECTION, null, null,
null);
if (phoneCursor != null) {
while (phoneCursormoveToNext()) {
得到手机号码
String phoneNumber = phoneCursorgetString(PHONES_NUMBER_INDEX);
当手机号码为空的或者为空栏位 跳过当前回圈
if (TextUtilsisEmpty(phoneNumber))
continue;
得到联络人名称
String contactName = phoneCursor
getString(PHONES_DISPLAY_NAME_INDEX);
Sim卡中没有联络人头像
mContactsNameadd(contactName);
mContactsNumberadd(phoneNumber);
}
phoneCursorclose();
}
}
class MyListAdapter extends BaseAdapter {
public MyListAdapter(Context context) {
mContext = context;
}
public int getCount() {
设定绘制数量
return mContactsNamesize();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iamge = null;
TextView title = null;
TextView text = null;
if (convertView == null) {
convertView = LayoutInflaterfrom(mContext)inflate(
Rlayoutcolorlist, null);
iamge = (ImageView) convertViewfindViewById(Ridcolor_image);
title = (TextView) convertViewfindViewById(Ridcolor_title);
text = (TextView) convertViewfindViewById(Ridcolor_text);
}
绘制联络人名称
titlesetText(mContactsNameget(position));
绘制联络人号码
textsetText(mContactsNumberget(position));
绘制联络人头像
iamgesetImageBitmap(mContactsPhontoget(position));
return convertView;
}
}
}
1、创建和打开数据库
在Android中创建和打开数据库要使用openOrCreateDatabase()方法来实现,返回一个
SQLiteDatabase对象
mSQLiteDatabase = thisopenOrCreateDatabase("Examples_08_10",MODE_PRIVATE,null);
2、创建表
使用execSQL方法创建表
String CREATE_TABLE = "CREATE_TABLE table1(_id INTEGER PRIMARY KEY,num INTERGER,data TEXT)";
mSQLitedatabaseexecSQL(CREATE_TABLE);
3、向表中添加一条数据
可以使用insert方法来添加数据,但是insert方法要求把数据都打包到ContentValues中,ContentValues
其实就是一个Map,Key值是字段名称,Value值是字段的值,通过ContentValues的put方法就可以把数据
放到ContentValues对象中,然后插入到表中
ContentValues cv = new ContentValues();
cvput(TABLE_NUMBER,1);
cvput(TABLE_DATA,"测试数据库数据");
mSQLiteDatabaseinsert(TABLE_NAME,null,cv);
这里也可以使用execSQL方法来执行一条插入的SQL语句
String INSERT_DATA = "INSERT INTO table1(_id,num,data)values(1,1,'通过SQL语句插入')";
mSQLiteDatabaseexecSQL(INSERT_DATA);
4、从表中删除数据
mSQLiteDatabasedelete("Examples_08_10db","WHERE _id" + 0,null);
String DELETE_DATA = "DELETE FROM table1 WHERE_id=1";
mSQLiteDatabaseexecSQL(DELETE_DATA);
5、修改表中的数据
ContentValues cv = new ContentValues();
cvput(TABLE_NUMBER,1);
cvput(TABLE_DATA,"修改后的数据");
mSQLiteDatabaseexecSQL("table1",cv,"num" + "=" + IntegertoString(0),null);
6、关闭数据库
mSQLiteDatabaseclose();
7、删除指定表
mSQliteDatabaseexecSQl("DROP TABLE table1");
8、删除数据库
thisdeleteDatabase("Examples_08_10db");
9、查询表中的某条数据
在Android中查询数据是通过Cursor类来实现的,当我们使用SQliteDatabasequery()方法时
会返回一个Cursor对象,Cursor指向的是每一条数据,它提供了很多有关查询的方法,具体方法
Cursor cur = mSQLiteDatabaserawQuery("SELECT FROM table",null);
if(cur !=null){
if(curmoveToFirst()){
do{
int numColumn =curgetColumnIndex("num");
int num = curgetInt(numColumn);
}while(curmoveToNext());
}
}
public class Activity01 extends Activity{
private static int mCount = 0;
//数据库对象
private SQLiteDatabase mSQLiteDatabase = null;
//数据库名
private final static String DATABASE_NAME = "Examples_08_11db"
//表名
private final static String TABLE_ID = "_id";
private final static String TABLE_NUM = "num";
private final static String TABLE_DATA = "data";
//创建表的SQL语句
private final static String CREATE_TABLE = "CREATE TABLE"+TABLE_NAME + "("
+ TABLE_ID + "INTEGER PRIMARY KEY,"+TABLE_NUM + "INTERGER,"+TABLE_DATA + "
TEXT)";
//线性布局
LinearLayout m_LinearLayout = null;
//列表视图-显示数据库的数据
ListView m_ListView = null;
public void onCreate(Bundle savedInstanceState){
superonCreate(savedInstanceState){
m_LinearLayout = new LinearLayout(this);
m_LinearLayoutsetOrientation(LinearLayoutVERTICAL);
m_LinearLayoutsetBackgroundColor(androidgraphicsColorBLACK);
//创建listview对象
m_ListView = new ListView(this);
LinearLayoutLayoutParams param = new LinearLayoutLayoutParams(LinearLayoutLayoutParamsFILL_PARENT,
LinearLayoutParamsWRAP_CONTENT);
m_ListViewsetBackgroundColor(ColorBLACK);
//添加m_ListView到m_LinearLayout中
m_LinearLayoutaddView(m_ListView,param);
//设置显示m_LinearLayout的布局
setContentView(m_LinearLayout);
//打开已经存在的数据库
mSQLiteDatabase = thisopenOrCreateDatabase(DATABASE_NAME,MODE_PRIVATE,null);
//获取数据库Phones中的Cursor
try{
//在数据库中创建一个表
mSQLiteDatabaseexecSQL(CREATE_TABLE);
}
catch(Exception e){
eUpdateAdapter();
}
}
public boolean onKeyUp(int keyCode,KeyEvent event){
switch(keyCode){
case KeyEventKEYCODE_DPAD_LEFT:
AddData();
break;
case KeyEventKEYCODE_DAPD_RIGHT:
DeleteData();
break;
case KeyEventKEYCODE_DAPD_1:
UpData();
break;
case KeyEventKEYCODE_DAPD_2:
DeleteTable();
break;
case KeyEventKEYCODE_DAPD_3:
DeleteDataBase();
break;
}
}
return true;
}
//删除数据库
public void DeleteDataBase(){
thisdeleteDatabase(DATABASE_NAME);
thisfinish();
}
//删除一个表
public void DeleteTable(){
mSQLiteDatabaseexecSQL("DROP TABLE" + TABLE_NAME);
thisfinish();
}
//更新一条数据
public void UpData(){
ContentValues cv = new ContentValues();
cvput(TABLE_NUM,mCount);
cvput(TABLE_DATA,"修改后的数据" + mCount);
//更新数据
mSQLiteDatabaseupdate(TABLE_NAME,cv,TABLE_NUM + "=" + IntegertoString(mCount -1),null);
UpdataAdapter();
}
public void AddData(){
ContentValues cv = new ContentValues();
cvput(TABLE_NUM,mCount);
cvput(TABLE_DATA,"测试数据库数据" + mCount);
//插入数据
mSQLiteDatainsert(TABLE_NAME,null,cv);
mCount++;
UpdataAdapter();
}
public void DeleteData(){
mSQLiteDatabaseexecSQL("DELETE FROM" + TABLE_NAME + "WHERE _id=" +IntegertoString(mCount));
mCount--;
if(mCount<0){
mCount--;
}
UpdataAdapter();
}
//更新视图显示
public void UpdateAdapter(){
//获取数据库Phones的Cursor
Cursor cur = mSQLiteDatabasequery(TABLE_NAME,new String[]{TABLE_ID,TABLE_NUM,TABLE_DATA},null,null,null,null,null);
mCount = curgetCount();
if(cur !=null && curgetCount()>=0){
ListAdapter adapter = new SimpleCusorAdapter(this,androidRlayoutsimple_list_item_2,cur,new String[]{TABLE_NUM,TABLE_DATA},new int[]{androidRidtext1,androidRidtext2});
m_ListViewsetAdapter(adapter);
}
}
//按键事件处理
public boolean onKeyDown(int keyCode,KeyEvent event){
if(keyCode == KeyEventKEYCODEKEYCODE_BACK){
//退出时不要忘记关闭
mSQLiteDatabaseclose();
thisfinish();
return true;
}
return superonKeyDown(keyCode,event);
}
}
SQliteOpenHelper应用
前面我们已经学过了SQLite编程基础,但是在实际开发中,为了更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库 *** 作类。SQLiteOpenHelper的构造方法中分别需要传入Context、数据库名称、CursorFactory(一般传入null,否则为默认数据库)、
数据库的版本号(不能为负数)同样在SQLiteOpenHelper中首先执行的是onCreate方法(当数据库第一次被创建时)。当然,在构造函数时并没有真正创建数据库,而是调用getWritableDatabase或者getReadableDatabase方法时才真正去创建数据库,并且返回一个SQLiteDatabase
对象。因此,我们就可以轻松的修改上一节了。
public class MyDataBaseAdapter{
//用于打印日志
private static final String TAG = "MyDataAdapter";
//表中一条数据的名称
private static final String KEY_ID = "_id";
//表中一条数据的内容
private static final String KEY_NUM = "num";
//表中一条数据的id
private static final String KEY_DATA = "data";
//数据库的名称
private static final String DB_NAME = "Examples_8_11db";
//数据库表名
private static final String DB_TABLE = "table1";
//数据库版本
private static final int DB_VERSION = 1;
//本地Context对象
private Context mContext = null;
private static final String DB_CREATE ="CREATE TABLE" + DB_TABLE + "(" +KEY_ID+"INTEGER PRIMARY KEY,"+KEY_NUM+"INTERGER,"+KEY_DATA+"TEXT)";
//执行open()打开数据库时,保存返回的数据库对象
private SQLiteDatabase mSQLiteDatabase = null;
//由SQLiteOpenHelper继承过来
private DatabaseHelper mDatabaseHelper = null;
private static class DatabaseHelper extends SQLiteOpenHelper{
//构造函数创建一个数据库
DatabHelper(Context context){
//当调用getWritableDatabase()
//或getReadableDatabase()方法时
//则创建一个数据库
super(context,DB_NAME,null,DB_VERSION);
}
//创建一个表
public void onCreate(SQLiteDatabase db){
//数据库没有表时创建一个
dbexecSQL(DB_CREATE);
}
//升级数据库
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
dbexecSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}
//构造函数
public MyDataBaseAdapter(Context mContext){
mContext = context;
}
//打开数据库
public void open()throws SQLException{
mDatabaseHelper = new DatabaseHelper(mContext);
mSQLiteDatabase = mDatabasehelpergetWritableDatabase();
}
//关闭数据库
public void close(){
mDatabaseHelperclose();
}
//插入一条数据
public long insertData(int num,String data){
ContentValues initialvalues = new ContentValues();
initialValuesput(KEY_NUM,num);
initialValuesput(KEY_DATA,data);
return mSQLiteDatabaseinsert(DB_TABLE,KEY_ID,initialValues);
}
//删除一条数据
public boolean deleteData(long rowId){
return mSQLiteDatabasedelete(DB_TABLE,KEY_ID+"="+rowId,null)>0;
}
//通过Cursor查询所有数据
public Cursor fetchAllData(){
return mSQLiteDatabasequery(DB_TABLE,new String[]{KEY_ID,KEY_NUM,KEY_DATA},null,null,null,null,null);
}
//查询指定数据
public Cursor fetchData(long rowId,null,null,null,null,null);
if(mCursor !=null){
mCursormoveToFirst();
}
return mCursor;
}
//更新一条数据
public boolean updateData(long rowId,int num,String data){
ContentValues args = new ContentValues();
argsput(KEY_NUM,num);
argsput(KEY_DATA,data);
return mSQLiteDatabaseupdate(DB_TABLE,args,KEY_ID+"="+rowId,null)>0;
}
}
如何使用MyDataBaseAdapter
public class Activity01 extends mCount = 0;
//线性布局
LinearLayout m_LinearLayout = null;
//列表视图-显示数据库中的数据
ListView mListView = null;
MyDataBaseAdapter m_MyDataBaseAdapter;
public void onCreate(Bundle savedInstanceState){
superonCreate(savedInstanceState);
//创建线性布局对象
m_LinearLayout = new LinearLayout(this);
m_LinearLayoutsetOrientation
以上就是关于关于PHP数据库全部的内容,包括:关于PHP数据库、delphi 锁定鼠标编程问题 请高手详细的一句句的说明下面的代码的意思,万分感谢、如何检测 Android Cursor 泄漏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)