編輯:關於android開發
使用小米號碼歸屬地數據庫,有兩張表data1和data2
先查詢data1表,把手機號碼截取前7位
select outkey from data1 where id=”前七位手機號”
再查詢data2表,
select location from data2 where id=”上面查出的outkey”
可以使用子查詢
select location from data2 where id=(select outkey from data1 where id=”前7位手機號”)
創建數據庫工具類
新建一個包xxx.db.dao
新建一個類NumberAddressUtils,新建一個靜態方法queryNumber
調用SQLiteDatabase.openDatabase()方法,獲取到SQLiteDatabase對象,參數:數據庫路徑(/data/data/包名/files/xxx.db),游標工廠(null),打開方式(SQLiteDatabse.OPEN_READONLY)
把數據庫address.db拷貝到 /data/data/包名/files/目錄裡面
調用SQLiteDatabase對象的rawQuery()方法,獲取到Cursor對象,查詢數據,參數:sql語句,string[]條件數組
例如:select location from data2 where id=(select outkey from data1 where id=?) ,new String[]{phone.subString(0,7)}
while循環Cursor對象,條件調用Cursor對象的moveToNext()方法
循環中調用Cursor對象的getString()方法,傳入字段索引
關閉游標Cursor對象的close()方法
把得到的地址返回出去
拷貝數據庫從assets目錄到data目錄
在歡迎頁面,進行拷貝
調用getAssets().open()方法,得到InputStream對象,參數:xxx.db文件名
獲取File對象,new出來,參數:getFilesDir()獲取到/data/data/包/files/目錄,xxx.db
獲取FileOutputStream對象,new出來,參數:File對象
定義緩沖區byte[] buffer,一般1024
定義長度len
while循環讀取,條件:讀入的長度不為-1
循環中調用FileOutputStream對象的write()方法,參數:緩沖區,從0開始,len長度
調用InputStream對象的close()方法
判斷只要存在和長度大於0就不再拷貝了,調用File對象的exist()方法和length()方法大於0
NumberQueryAddressUtil.java
package com.qingguow.mobilesafe.utils; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class NumberQueryAddressUtil { private static final String path = "/data/data/com.qingguow.mobilesafe/files/address.db"; /** * 查詢號碼歸屬地 * @param phone * @return */ public static String queryAddress(String phone){ SQLiteDatabase db=SQLiteDatabase.openDatabase(path, null,SQLiteDatabase.OPEN_READONLY); Cursor cursor=db.rawQuery("select location from data2 where id=(select outkey from data1 where id=?)", new String[]{phone.substring(0,7)}); while(cursor.moveToNext()){ String address=cursor.getString(0); return address; } cursor.close(); return ""; } }
拷貝數據庫
private void copyAddressDatabase() { try { //判斷是否存在 File file = new File(getFilesDir(), "address.db"); if (file.exists() && file.length() > 0) { return; } InputStream is = getAssets().open("address.db"); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } is.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
相關技術:
知乎:android如何為listview設置自定義字體?
listview無法使用setTypeface
就像知乎app側滑菜單這樣的,像首頁,發現,關注,收藏,草稿,提問這幾個字如何更改為自定義的字體呢?
Allan:
我默認你說的自定義字體是指使用外部 ttf 字體文件
1. main/assets/fonts 下放置 ttf 字體
2. 讀取 ttf 字體文件
Typeface mTypeface = Typeface.createFromAsset(getAssets(), "fonts/XXXXX.ttf");
3. 自定義 Button/TextView/EditText 等控件
setTypeface(getYourTypeface());
知乎:為什麼大多數時候OutputStream都要被向上轉型?
OutputStream os= new FileOutputStream()
為什麼不直接這樣:
FileOutputStream fos = new FileOutputStream()
得到一個OutputStream這個抽象類的實例有什麼意義?
資深鐵銹:
這樣寫是實現多態, 可以降低類之間的依賴性,可以使程序代碼更加健壯。如果會用Spring框架的話,這樣寫帶來的好處自然能夠體會到。
另外:OutputStream os= new FileOutputStream() ; 得到一個OutputStream這個抽象類的實例這樣說是不對的,抽象類是沒有實例的,應該是得到OutputStream 的引用,FileOutputStream的實例。
mixer 結構分析[uavcan為例]mixer指令為系統的app命令,位置在Firmware/src/systemcmds/mixer目錄下面,其功能是裝載mix文件
Android重構與設計之路,從整理提示對話框彈窗開始,android彈窗 封裝一個獨立彈窗Module,這裡的彈窗包括普通的Dialog方式彈框和WindowMana
Android進程通信之兩種序列化方式分析 2月下旬辭職了,去海南度假到現在,領略了一把三亞風情也算任性和 然而這樣任性帶來的後果就是。。不行了我必須吐槽一句。。 沒
Android 100多個Styles快速開發布局XML,一行搞定View屬性,一鍵統一配置UI...,androidui.. Android開發中大量使用X
Android種使用Notification實現通知管理以及自定義通知欄