2025-05-24

 

通過上一篇文章 android開發我的新浪微博客戶端-載入頁面UI篇(1.1)/kf/201203/124461.html 已經完成瞭載入頁面的UI部分的實現,效果如上圖,接下來在上面的基礎上完成載入頁面的功能代碼。

      首先說明一下新浪微博提供瞭OAuth和Base OAuth兩種認證方式(如果不知道什麼是OAuth和Base OAuth請自己google一下惡補,同時接下來的2篇隨筆也會對這方面進行詳細的說明以及具體實現),本項目是采用OAuth認證方式,采用這種方式就需要有用戶的新浪UserID、Access Token、Access Secret這3樣東西才能自由便利的調用新浪的開放接口,本項目是這樣做的當用戶第一次使用軟件時進行授權認證獲取這3樣東西的時候存儲到sqlite庫中以便用戶下次使用時不需要重新進行繁瑣的授權認證操作直接從sqlite庫中讀取出來即可,由於這樣的需求載入頁面的功能設定是這樣:當用戶打開軟件顯示載入頁面時開始檢查sqlite庫中是否已經保存有用戶的新浪微博的UserID號、Access Token、Access Secret的記錄,如果一條記錄都沒有那就說明用戶是第一次使用本軟件那麼跳到認證授權頁面進行授權認證操作(認證授權功能在接下來的兩篇中進行實現講解)獲取這3個值保存到sqlite庫中,如果已經包括瞭記錄,那麼讀取這些記錄的UserID號、Access Token、Access Secret值然後根據這3個值調用新浪的api接口獲取這些記錄對應的用戶昵稱和用戶頭像圖標等信息。

      上面功能設定中涉及到sqlite數據庫的創建、數據表的創建、數據記錄的添加、數據記錄的讀取等操作,這裡新建名為SqliteHelper.java類文件提供sqlite數據表的創建、更新等,代碼如下

[java] public class SqliteHelper extends SQLiteOpenHelper{ 
 
    //用來保存  
 
UserID、Access Token、Access Secret 
 
的表名 
 
    public static final String TB_NAME="users"; 
 
    public SqliteHelper(Context context, String name, CursorFactory factory, int version) { 
 
        super(context, name, factory, version); 
 
    } 
 
    //創建表  
 
    @Override 
 
    public void onCreate(SQLiteDatabase db) { 
 
        db.execSQL("CREATE TABLE IF NOT EXISTS "+ 
 
                TB_NAME+"("+ 
 
                UserInfo.ID+" integer primary key,"+ 
 
                UserInfo.USERID+" varchar,"+ 
 
                UserInfo.TOKEN+" varchar,"+ 
 
                UserInfo.TOKENSECRET+" varchar,"+ 
 
                UserInfo.USERNAME+" varchar,"+ 
 
                UserInfo.USERICON+" blob"+ 
 
                ")" 
 
                ); 
 
        Log.e("Database","onCreate"); 
 
    } 
 
    //更新表  
 
    @Override 
 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
 
        db.execSQL("DROP TABLE IF EXISTS " + TB_NAME); 
 
        onCreate(db); 
 
        Log.e("Database","onUpgrade"); 
 
    } 
 
    //更新列  
 
    public void updateColumn(SQLiteDatabase db, String oldColumn, String newColumn, String typeColumn){ 
 
        try{ 
 
            db.execSQL("ALTER TABLE " + 
 
                    TB_NAME + " CHANGE " + 
 
                    oldColumn + " "+ newColumn + 
 
                    " " + typeColumn 
 
            ); 
 
        }catch(Exception e){ 
 
            e.printStackTrace(); 
 
        } 
 
    } 
 

public class SqliteHelper extends SQLiteOpenHelper{

    //用來保存

UserID、Access Token、Access Secret

的表名

    public static final String TB_NAME="users";

    public SqliteHelper(Context context, String name, CursorFactory factory, int version) {

        super(context, name, factory, version);

    }

    //創建表

    @Override

    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE IF NOT EXISTS "+

                TB_NAME+"("+

                UserInfo.ID+" integer primary key,"+

                UserInfo.USERID+" varchar,"+

                UserInfo.TOKEN+" varchar,"+

                UserInfo.TOKENSECRET+" varchar,"+

                UserInfo.USERNAME+" varchar,"+

                UserInfo.USERICON+" blob"+

                ")"

                );

        Log.e("Database","onCreate");

    }

    //更新表

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS " + TB_NAME);

        onCreate(db);

        Log.e("Database","onUpgrade");

    }

    //更新列

    public void updateColumn(SQLiteDatabase db, String oldColumn, String newColumn, String typeColumn){

        try{

            db.execSQL("ALTER TABLE " +

                    TB_NAME + " CHANGE " +

                    oldColumn + " "+ newColumn +

                    " " + typeColumn

            );

        }catch(Exception e){

            e.printStackTrace();

        }

    }

}
接下來新建名為DataHelper.java類文件實現用戶記錄的創建、更新、刪除等,代碼如下:

[java] public class DataHelper { 
 
    //數據庫名稱  
 
    private static String DB_NAME = "mysinaweibo.db"; 
 
    //數據庫版本  
 
    private static int DB_VERSION = 2; 
 
    private SQLiteDatabase db; 
 
    private SqliteHelper dbHelper; 
 
     
 
    public DataHelper(Context context){ 
 
        dbHelper=new SqliteHelper(context,DB_NAME, null, DB_VERSION); 
 
        db= dbHelper.getWritableDatabase(); 
 
    } 
 
     
 
    public void Close() 
 
    { 
 
        db.close(); 
 
        dbHelper.close(); 
 
    } 
 
    //獲取users表中的UserID、Access Token、Access Secret的記錄  
 
    public List<UserInfo> GetUserList(Boolean isSimple) 
 
    { 
 
        List<UserInfo> userList = new ArrayList<UserInfo>(); 
 
        Cursor cursor=db.query(SqliteHelper.TB_NAME, null, null, null, null, null, UserInfo.ID+" DESC"); 
 
        cursor.moveToFirst(); 
 
        while(!cursor.isAfterLast()&& (cursor.getString(1)!=null)){ 
 
            UserInfo user=new UserInfo(); 
 
            user.setId(cursor.getString(0)); 
 
            user.setUserId(cursor.getString(1)); 
 
            user.setToken(cursor.getString(2)); 
 
            user.setTokenSecret(cursor.getString(3)); 
 
            if(!isSimple){ 
 
            user.setUserName(cursor.getString(4)); 
 
            ByteArrayInputStream stream = new ByteArrayInputStream(cursor.getBlob(5));  
 
            Drawable icon= Drawable.createFromStream(stream, "image"); 
 
            user.setUserIcon(icon); 
 
            } 
 
            userList.add(user); 
 
            cursor.moveToNext(); 
 
        } 
 
        cursor.close(); 
 
        return userList; 
 
    } 
 
     
 
    //判斷users表中的是否包含某個UserID的記錄  
 
    public Boolean HaveUserInfo(String UserId) 
 
    { 
 
        Boolean b=false; 
 
        Cursor cursor=db.query(SqliteHelper.TB_NAME, null, UserInfo.USERID + "=" + UserId, null, null, null,null); 
 
        b=cursor.moveToFirst(); 
 
        Log.e("HaveUserInfo",b.toString()); 
 
        cursor.close(); 
 
        return b; 
 
    } 
 
     
 
    //更新users表的記錄,根據UserId更新用戶昵稱和用戶圖標  
 
    public int UpdateUserInfo(String userName,Bitmap userIcon,String UserId) 
 
    { 
 
        ContentValues values = new ContentValues(); 
 
        values.put(UserInfo.USERNAME, userName); 
 
        // BLOB類型    
 
        final ByteArrayOutputStream os = new ByteArrayOutputStream();   
 
        // 將Bitmap壓縮成PNG編碼,質量為100%存儲            
 
        userIcon.compress(Bitmap.CompressFormat.PNG, 100, os);    
 
        // 構造SQLite的Content對象,這裡也可以使用raw    
 
        values.put(UserInfo.USERICON, os.toByteArray()); 
 
        int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + "=" + UserId, null); 
 
        Log.e("UpdateUserInfo2",id+""); 
 
        return id; 
 
    } 
 
     
 
    //更新users表的記錄  
 
    public int UpdateUserInfo(UserInfo user) 
 
    { 
 
        ContentValues values = new ContentValues(); 
 
        values.put(UserInfo.USERID, user.getUserId()); 
 
        values.put(UserInfo.TOKEN, user.getToken()); 
 
        values.put(UserInfo.TOKENSECRET, user.getTokenSecret()); 
 
        int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + "=" + user.getUserId(), null); 
 
        Log.e("UpdateUserInfo",id+""); 
 
        return id; 
 
    } 
 
     
 
    //添加users表的記錄  
 
    public Long SaveUserInfo(UserInfo user) 
 
    { 
 
        ContentValues values = new ContentValues(); 
 
        values.put(UserInfo.USERID, user.getUserId()); 
 
        values.put(UserInfo.TOKEN, user.getToken()); 
 
        values.put(UserInfo.TOKENSECRET, user.getTokenSecret()); 
 
        Long uid = db.insert(SqliteHelper.TB_NAME, UserInfo.ID, values); 
 
        Log.e("SaveUserInfo",uid+""); 
 
        return uid; 
 
    } 
 
     
 
    //刪除users表的記錄  
 
    public int DelUserInfo(String UserId){ 
 
        int id=  db.delete(SqliteHelper.TB_NAME, UserInfo.USERID +"="+UserId, null); 
 
        Log.e("DelUserInfo",id+""); 
 
        return id; 
 
    } 
 

public class DataHelper {

    //數據庫名稱

    private static String DB_NAME = "mysinaweibo.db";

    //數據庫版本

    private static int DB_VERSION = 2;

    private SQLiteDatabase db;

    private SqliteHelper dbHelper;

   

    public DataHelper(Context context){

        dbHelper=new SqliteHelper(context,DB_NAME, null, DB_VERSION);

        db= dbHelper.getWritableDatabase();

    }

   

    public void Close()

    {

        db.close();

        dbHelper.close();

    }

    //獲取users表中的UserID、Access Token、Access Secret的記錄

    public List<UserInfo> GetUserList(Boolean isSimple)

    {

        List<UserInfo> userList = new ArrayList<UserInfo>();

        Cursor cursor=db.query(SqliteHelper.TB_NAME, null, null, null, null, null, UserInfo.ID+" DESC");

        cursor.moveToFirst();

        while(!cursor.isAfterLast()&& (cursor.getString(1)!=null)){

            UserInfo user=new UserInfo();

            user.setId(cursor.getString(0));

            user.setUserId(cursor.getString(1));

            user.setToken(cursor.getString(2));

            user.setTokenSecret(cursor.getString(3));

            if(!isSimple){

            user.setUserName(cursor.getString(4));

            ByteArrayInputStream stream = new ByteArrayInputStream(cursor.getBlob(5));

            Drawable icon= Drawable.createFromStream(stream, "image");

            user.setUserIcon(icon);

            }

            userList.add(user);

            cursor.moveToNext();

        }

        cursor.close();

        return userList;

    }

   

    //判斷users表中的是否包含某個UserID的記錄

    public Boolean HaveUserInfo(String UserId)

    {

        Boolean b=false;

        Cursor cursor=db.query(SqliteHelper.TB_NAME, null, UserInfo.USERID + "=" + UserId, null, null, null,null);

        b=cursor.moveToFirst();

        Log.e("HaveUserInfo",b.toString());

        cursor.close();

        return b;

    }

   

    //更新users表的記錄,根據UserId更新用戶昵稱和用戶圖標

    public int UpdateUserInfo(String userName,Bitmap userIcon,String UserId)

    {

        ContentValues values = new ContentValues();

        values.put(UserInfo.USERNAME, userName);

        // BLOB類型 

        final ByteArrayOutputStream os = new ByteArrayOutputStream(); 

        // 將Bitmap壓縮成PNG編碼,質量為100%存儲         

        userIcon.compress(Bitmap.CompressFormat.PNG, 100, os);  

        // 構造SQLite的Content對象,這裡也可以使用raw 

        values.put(UserInfo.USERICON, os.toByteArray());

        int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + "=" + UserId, null);

        Log.e("UpdateUserInfo2",id+"");

        return id;

    }

   

    //更新users表的記錄

    public int UpdateUserInfo(UserInfo user)

    {

        ContentValues values = new ContentValues();

        values.put(UserInfo.USERID, user.getUserId());

        values.put(UserInfo.TOKEN, user.getToken());

        values.put(UserInfo.TOKENSECRET, user.getTokenSecret());

        int id= db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID + "=" + user.getUserId(), null);

        Log.e("UpdateUserInfo",id+"");

        return id;

    }

   

    //添加users表的記錄

    public Long SaveUserInfo(UserInfo user)

    {

        ContentValues values = new ContentValues();

        values.put(UserInfo.USERID, user.getUserId());

        values.put(UserInfo.TOKEN, user.getToken());

        values.put(UserInfo.TOKENSECRET, user.getTokenSecret());

        Long uid = db.insert(SqliteHelper.TB_NAME, UserInfo.ID, values);

        Log.e("SaveUserInfo",uid+"");

        return uid;

    }

   

    //刪除users表的記錄

    public int DelUserInfo(String UserId){

        int id=  db.delete(SqliteHelper.TB_NAME, UserInfo.USERID +"="+UserId, null);

        Log.e("DelUserInfo",id+"");

        return id;

    }

}
 完成上面的代碼後,我們需要在載入頁面中調用上面的方法實現sqlite庫中是否已經保存有用戶的新浪微博的UserID號、Access Token、Access Secret的記錄的功能在MainActivity的onCreate方法添加代碼:

 

[java] public void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
 
        setContentView(R.layout.main); 
 
 
 
        …… 
 
 
 
        //獲取賬號列表  
 
        dbHelper=new DataHelper(this); 
 
        List<UserInfo> userList= dbHelper.GetUserList(true); 
 
        if(userList.isEmpty())//如果為空說明第一次使用跳到AuthorizeActivity頁面進行OAuth認證  
 
        { 
 
               Intent intent = new Intent(); 
 
               intent.setClass(MainActivity.this, AuthorizeActivity.class); 
 
               startActivity(intent); 
 
        } 
 
        else//如果不為空讀取這些記錄的UserID號、Access Token、Access Secret值  
 
            //然後根據這3個值調用新浪的api接口獲取這些記錄對應的用戶昵稱和用戶頭像圖標等信息。  
 
        { 
 
               for(UserInfo user:userList){ 
 
                  …… 
 
               } 
 
        } 
 

 
摘自  落日小屋 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *