Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> [android] 手機衛士號碼歸屬地查詢,android歸屬地查詢

[android] 手機衛士號碼歸屬地查詢,android歸屬地查詢

編輯:關於android開發

[android] 手機衛士號碼歸屬地查詢,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的實例。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved