android开发我的新浪微博客户端-载入页面sqlite篇(1.2)

本文介绍了一个基于Android的新浪微博客户端登录流程,重点讲述了如何利用SQLite数据库存储和读取用户的认证信息,并在此基础上实现用户登录状态的自动识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过上一篇文章 android开发我的新浪微博客户端-载入页面UI篇(1.1)已经完成了载入页面的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数据表的创建、更新等,代码如下

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类文件实现用户记录的创建、更新、删除等,代码如下:

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方法添加代码:

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){

                  ......

               }

        }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值