android数据库_android数据库加密 - CSDN
精华内容
参与话题
  • Android创建和使用数据库

    万次阅读 2018-05-31 15:13:53
     每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源...

    一、关系型数据库SQLIte

            每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。

    SQLite体系结构图如下:

    框架图     

      编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协同处理文本形式的结构化查询语句。

      后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者写入页面。

      公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。

     SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:

    1、轻量级

    SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。

    2、独立性

    SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。

    3、隔离性

    SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。

    4、跨平台

    SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。

    5、多语言接口

    SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。

    6、安全性

    SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。

     

    SQLite官方网站(http://www.sqlite.org),了解更多内容请前往。

    二、导出查看数据库文件

      在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/package_name/databases文件夹中。

      想要将数据库文件导出可以使用eclipse,如图所示:

     导出数据库文件

      查看数据库,使用SQlite Database Browser,如图所示:

     查看数据库

    三、扩展类

    3.1扩展SQLiteOpenHelper

      Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:

      构造函数,调用父类 SQLiteOpenHelper 的构造函数

      onCreate()方法;// TODO 创建数据库后,对数据库的操作

      onUpgrage()方法。// TODO 更改数据库版本的操作

      当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。

      操作数据库的最佳实践是创建一个辅助类,例如联系人模块

      class ContactsDatabaseHelper extends SQLiteOpenHelper

    3.2 Cursor类

      Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。

    3.3 数据类型

      SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。
    四、数据库操作

    4.1创建数据库
            Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
    构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
    onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
    onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

    下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:

    public class DatabaseHelper extends SQLiteOpenHelper {     
     DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version) 
     {     
       super(context, name, cursorFactory, version);     
        }     
         
        @Override    
        public void onCreate(SQLiteDatabase db) {     
            // TODO 创建数据库后,对数据库的操作     
        }     
         
        @Override    
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     
            // TODO 更改数据库版本的操作     
        }     
         
    @Override    
    public void onOpen(SQLiteDatabase db) {     
            super.onOpen(db);       
            // TODO 每次成功打开数据库后首先被执行     
        }     
    }     

           接下来讨论具体如何创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例,具体调用那个方法,取决于你是否需要改变数据库的内容:

    db=(new DatabaseHelper(getContext())).getWritableDatabase(); 
    return (db == null) ? false : true; 

    上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就可以查询或者修改数据库。

    当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。

    4.2创建表和索引

    为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。如果没有异常,这个方法没有返回值。

    例如,你可以执行如下代码:

    db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY   
           AUTOINCREMENT, title TEXT, value REAL);"); 

            这条语句会创建一个名为 mytable 的表,表有一个列名为 _id,并且是主键,这列的值是会自动增长的整数(例如,当你插入一行时,SQLite 会给这列自动赋值),另外还有两列:title( 字符 ) 和 value( 浮点数 )。 SQLite 会自动为主键列创建索引。

            通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的 schema,不需要删除表和索引 . 删除表和索引,需要使用 execSQL() 方法调用 DROP INDEX 和 DROP TABLE 语句。

    4.3给表添加数据

    上面的代码,已经创建了数据库和表,现在需要给表添加数据。有两种方法可以给表添加数据。

    像上面创建表一样,你可以使用 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL() 方法适用于所有不返回结果的 SQL 语句。例如:

    db.execSQL("INSERT INTO widgets (name, inventory)"+ 
    "VALUES ('Sprocket', 5)"); 

    另一种方法是使用 SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。示例如下:

    ContentValues cv=new ContentValues(); 
    cv.put(Constants.TITLE, "example title"); 
    cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I); 
    db.insert("mytable", getNullColumnHack(), cv); 

    update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记。update() 根据条件,更新指定列的值,所以用 execSQL() 方法可以达到同样的目的。

    WHERE 条件和其参数和用过的其他 SQL APIs 类似。例如:

    String[] parms=new String[] {"this is a string"}; 
    db.update("widgets", replacements, "name=?", parms); 

    delete() 方法的使用和 update() 类似,使用表名,可选的 WHERE 条件和相应的填充 WHERE 条件的字符串。

    4.3查询数据库

    类似 INSERT, UPDATE, DELETE,有两种方法使用 SELECT 从 SQLite 数据库检索数据。

    1 .使用 rawQuery() 直接调用 SELECT 语句;

    使用 query() 方法构建一个查询。

    Raw Queries

    正如 API 名字,rawQuery() 是最简单的解决方法。通过这个方法你就可以调用 SQL SELECT 语句。例如:

    Cursor c=db.rawQuery( 
        "SELECT name FROM sqlite_master WHERE type='table' AND name='mytable'",

    在上面例子中,我们查询 SQLite 系统表(sqlite_master)检查 table 表是否存在。返回值是一个 cursor 对象,这个对象的方法可以迭代查询结果。

    如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用 query() 方法会方便很多。

    Regular Queries

    query() 方法用 SELECT 语句段构建查询。SELECT 语句内容作为 query() 方法的参数,比如:要查询的表名,要获取的字段名,WHERE 条件,包含可选的位置参数,去替代 WHERE 条件中位置参数的值,GROUP BY 条件,HAVING 条件。

    除了表名,其他参数可以是 null。所以,以前的代码段可以可写成:

    String[] columns={"ID", "inventory"}; 
    String[] parms={"snicklefritz"}; 
    Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null); 

    使用游标

    不管你如何执行查询,都会返回一个 Cursor,这是 Android 的 SQLite 数据库游标,使用游标,你可以:

    通过使用 getCount() 方法得到结果集中有多少记录;

    通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历所有记录;

    通过 getColumnNames() 得到字段名;

    通过 getColumnIndex() 转换成字段号;

    通过 getString(),getInt() 等方法得到给定字段当前记录的值;

    通过 requery() 方法重新执行查询得到游标;

    通过 close() 方法释放游标资源;

    例如,下面代码遍历 mytable 表

    Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable"); 
       result.moveToFirst(); 
       while (!result.isAfterLast()) { 
           int id=result.getInt(0); 
           String name=result.getString(1); 
           int inventory=result.getInt(2); 
           // do something useful with these 
           result.moveToNext(); 
         } 
         result.close(); 

    在 Android 中使用 SQLite 数据库管理工具

    在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的 API。使用 Android 模拟器,有两种可供选择的方法来管理数据库。

    首先,模拟器绑定了 sqlite3 控制台程序,可以使用 adb shell 命令来调用他。只要你进入了模拟器的 shell,在数据库的路径执行 sqlite3 命令就可以了。数据库文件一般存放在:

    /data/data/your.app.package/databases/your-db-name

    如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用 SQLite-aware 客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。

    把数据库从设备上考出来,你可以使用 adb pull 命令(或者在 IDE 上做相应操作)。存储一个修改过的数据库到设备上,使用 adb push 命令。

    一个最方便的 SQLite 客户端是 FireFox SQLite Manager 扩展,它可以跨所有平台使用。

    图 2. SQLite Manager

    \

    五、实际应用

     Android在运行时集成了SQLite , 所以每个Android应用程序都可以使用SQLite数据库。

      数据库存放的位置:data/<项目文件夹>/databases/

      第一步:创建数据库

      Android 中提供SQLiteOpenHelper类帮助创建一个数据库,继承该类可以轻松的创建SQLite数据库;

      注意:SQLiteOpenHelper的子类至少要实现三个方法:

      * 带参的构造方法;

      * onCreate();

      * onUpgrag();

      java代码如下:

    package com.example.sqlite;
    
      import android.content.Context;
    
      import android.database.sqlite.SQLiteDatabase;
    
      import android.database.sqlite.SQLiteDatabase.CursorFactory;
    
      import android.database.sqlite.SQLiteOpenHelper;
    
      /* SQLiteOpenHelper的子类, 用于操作数据库
    
      *
    
      * SQLiteOpenHelper 是一个辅助类,用来管理数据库的创建和版本,提供两方面的功能;
    
      *
    
      * 第一:getReadableDatabase() 、 getWriteableDatabase() 可以获得SQLiteDatabase对象,通过该对象可以对数据库进行操作;
    
      *
    
      * 第二:提供onCreate() ; onUpgrade() 两个回调函数,允许我们再创建和删除数据库时,进行自己的操作;
    
      *
    
      * */
    
      public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    
      /* 构造方法,调用父类SQLiteOpenHelper的构造函数 */
    
      /* 参1:上下文环境;参2:数据库名称(以.db结尾) ; 参3:游标工厂(默认为null) ; 参4:代表使用数据库模型版本的证书*/
    
      public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
    
      super(context, name, factory, version);
    
      }
    
      /* 根据需要对SQLiteDatabase 的对象填充表和数据初始化 */
    
      /* 该方法时在第一次创建的时候执行,实际上时第一次得到SQLiteDatabase对象的时侯才会调用这个方法 */
    
      public void onCreate(SQLiteDatabase db) {
    
      // TODO 创建数据库后,对数据库的操作
    
      }
    
      /* 将数据库从旧的模型转换为新的模型 *//* 参1:对象 ; 参2:旧版本号 ; 参3:新版本号 */
    
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
      // TODO 更改数据库版本的操作
    
      }
    
      /* 打开数据库执行的函数 */
    
      public void onOpen(SQLiteDatabase db) {
    
      // TODO 每次成功打开数据库后首先被执行
    
      super.onOpen(db);
    
      }
    
      }
    
      package com.example.sqlite;
    
      import android.content.Context;
    
      import android.database.sqlite.SQLiteDatabase;
    
      import android.database.sqlite.SQLiteDatabase.CursorFactory;
    
      import android.database.sqlite.SQLiteOpenHelper;
    
      /* SQLiteOpenHelper的子类, 用于操作数据库
    
      *
    
      * SQLiteOpenHelper 是一个辅助类,用来管理数据库的创建和版本,提供两方面的功能;
    
      *
    
      * 第一:getReadableDatabase() 、 getWriteableDatabase() 可以获得SQLiteDatabase对象,通过该对象可以对数据库进行操作;
    
      *
    
      * 第二:提供onCreate() ; onUpgrade() 两个回调函数,允许我们再创建和删除数据库时,进行自己的操作;
    
      *
    
      * */
    
      public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    
      /* 构造方法,调用父类SQLiteOpenHelper的构造函数 */
    
      /* 参1:上下文环境;参2:数据库名称(以.db结尾) ; 参3:游标工厂(默认为null) ; 参4:代表使用数据库模型版本的证书*/
    
      public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
    
      super(context, name, factory, version);
    
      }
    
      /* 根据需要对SQLiteDatabase 的对象填充表和数据初始化 */
    
      /* 该方法时在第一次创建的时候执行,实际上时第一次得到SQLiteDatabase对象的时侯才会调用这个方法 */
    
      public void onCreate(SQLiteDatabase db) {
    
      // TODO 创建数据库后,对数据库的操作
    
      }
    
      /* 将数据库从旧的模型转换为新的模型 *//* 参1:对象 ; 参2:旧版本号 ; 参3:新版本号 */
    
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
      // TODO 更改数据库版本的操作
    
      }
    
      /* 打开数据库执行的函数 */
    
      public void onOpen(SQLiteDatabase db) {
    
      // TODO 每次成功打开数据库后首先被执行
    
      super.onOpen(db);
    
      }
    
      }

    案例代码如下:

    package com.example.sqlite;
    
      import android.app.Activity;
    
      import android.content.ContentValues;
    
      import android.database.Cursor;
    
      import android.database.sqlite.SQLiteDatabase;
    
      import android.os.Bundle;
    
      import android.view.View;
    
      import android.view.View.OnClickListener;
    
      import android.widget.Button;
    
      import android.widget.Toast;
    
      public class MainActivity extends Activity {
    
      /* 设置表相关信息的常量 */
    
      final String MYTAB = "t_score";
    
      final String MYNAME ="name";
    
      final String MYSCORE = "score";
    
      MySQLiteOpenHelper helper;
    
      private Button selectData,createDatabase,createTable,insertData,updateData,deleteData;
    
      /* 获取组建对象 */
    
      public void init(){
    
      selectData = (Button) findViewById(R.id.selectData);
    
      createDatabase = (Button) findViewById(R.id.createDatabase);
    
      createTable = (Button) findViewById(R.id.createTable);
    
      insertData = (Button) findViewById(R.id.insertData);
    
      updateData = (Button) findViewById(R.id.updateData);
    
      deleteData = (Button) findViewById(R.id.deleteData);
    
      }
    
      protected void onCreate(Bundle savedInstanceState) {
    
      super.onCreate(savedInstanceState);
    
      setContentView(R.layout.main);
    
      /* 初始化组件对象 */
    
      init();
    
      /* 创建数据库 */
    
      createDatabase.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 创建一个MySQLiteOpenHelper,该语句执行是不会创建或打开连接的 */
    
      helper = new MySQLiteOpenHelper(MainActivity.this, "mydb.db", null, 1);
    
      /* 调用MySQLiteOpenHelper的getWriteableDatabase()方法,创建或者打开一个连接 */
    
      SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
    
      Toast.makeText(MainActivity.this, "数据库创建成功", 1000).show();
    
      }
    
      });
    
      /* 创建表 */
    
      createTable.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 创建一个MySQLiteOpenHelper,该语句执行是不会创建或打开连接的 */
    
      helper = new MySQLiteOpenHelper(MainActivity.this, "mydb.db", null, 1);
    
      /* 获取一个可写的SQLiteDatabase对象,创建或打开连接 */
    
      SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();
    
      /* 创建两张表 */
    
      sqliteDatabase.execSQL("create table student(id INTEGER PRIMARY KEY autoincrement,name text);");
    
      sqliteDatabase.execSQL("create table "+MYTAB+"("+MYNAME+" text,"+MYSCORE+" integer);");
    
      /* 小贴士 */
    
      Toast.makeText(MainActivity.this, "数据表创建成功", 1000).show();
    
      }
    
      });
    
      /* 插入数据 */
    
      insertData.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 连接数据库 *//* 数据库中有表 , 对表进行操作 */
    
      SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();
    
      /* 给表添加数据: *//* 方式1: *//* 增加一条数据 */
    
      sqliteDatabase.execSQL("insert into student(name) values('mike')");
    
      /* 方式2: *//* 使用SQLiteDatabase 对象的insert()方法 */
    
      /* 创建ContentValues对象 *//* 每次插入的时一条数据 */
    
      ContentValues cv = new ContentValues();
    
      cv.put("name", "mary"); /* key==列 value==值 */
    
      sqliteDatabase.insert("student", null, cv);
    
      cv.clear();
    
      /* 对MYTAB进行数据添加 */
    
      sqliteDatabase.execSQL("insert into "+MYTAB+" values('ray',95)");
    
      sqliteDatabase.execSQL("insert into "+MYTAB+" values('tom',85)");
    
      sqliteDatabase.execSQL("insert into "+MYTAB+" values('jone',90)");
    
      cv.put(MYNAME, "jack");
    
      cv.put(MYSCORE, 78);
    
      sqliteDatabase.insert(MYTAB, null, cv);
    
      cv.clear();
    
      Toast.makeText(MainActivity.this, "数据插入成功", 1000).show();
    
      }
    
      });
    
      /* 修改数据 *//* updateData点击事件监听器 */
    
      updateData.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 建立和数据库的连接,获取SQLiteDatabase对象 */
    
      SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();
    
      /* 方式1:直接使用语句 */
    
      //sqliteDatabase.execSQL("update student set name='mary key' where id=1");
    
      /* 方式2:使用sqliteDatabase.update();方法 */
    
      ContentValues cv = new ContentValues();
    
      cv.put("name", "mary key"); /* 确定需要修改对应列的值 */
    
      /* 参1:表名 ; 参2:ContentValues对象; 参3:where字句,相当于sql中where后面的语句,?是占位符 */
    
      /* 参4:占位符的值; */
    
      sqliteDatabase.update("student", cv, "id=?", new String[]{"1"});
    
      Toast.makeText(MainActivity.this, "数据修改成功", 1000).show();
    
      }
    
      });
    
      /* 删除数据 ; 设置deleteData点击事件监听器 */
    
      deleteData.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 与数据库建立联系,获得SQLiteDatabase的对象 */
    
      SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();
    
      /* 使用sql语句直接进行删除 */
    
      //sqliteDatabase.execSQL("");
    
      /* 调用:SQLiteDatabase对象的delete()的方法删除数据 */
    
      /* 参1:表名; 参2:条件语句; 参3:条件语句中对应占位符的值 */
    
      sqliteDatabase.delete("student", "id=?", new String[]{"1"});
    
      Toast.makeText(MainActivity.this, "数据删除成功", 1000).show();
    
      }
    
      });
    
      /* 查看数据 *//* selectData点击事件监听器 */
    
      selectData.setOnClickListener(new OnClickListener() {
    
      public void onClick(View v) {
    
      /* 获取SQLiteDatabase的对象 */
    
      SQLiteDatabase sqliteDatabase = helper.getReadableDatabase();
    
      /* 调用SQLiteDatabase的query()方法进行查询,返回一个Cursor对象:由数据库查询返回的结果集对象 */
    
      /* 参1 String:表名
    
      * 参2 String[]:需要查询的列;
    
      * 参3 String :查询条件;
    
      * 参4 String[]:查询条件的参数;
    
      * 参5 String: 对查询的结果进行分组;
    
      * 参6 String: 对分组结果进行限制;
    
      * 参7 String: 对查询结果进行排序;
    
      *
    
      * */
    
      Cursor cursor = sqliteDatabase.query("student", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
    
      /* 保存结果集中对应字段的数据 */
    
      String id = null;
    
      String name = null;
    
      /* 从结果集中读取数据 */
    
      while(cursor.moveToNext()){
    
      id = cursor.getString(cursor.getColumnIndex("id"));
    
      name = cursor.getString(cursor.getColumnIndex("name"));
    
      }
    
      Toast.makeText(MainActivity.this, "查询数据为:id="+id+" \n name="+name, 1000).show();
    
      }
    
      });
    
      }
    
      }

    六、结束语

            如果你想要开发 Android 应用程序,一定需要在 Android 上存储数据,使用 SQLite 数据库是一种非常好的选择。推荐框架GreenDao,使用详见:https://blog.csdn.net/chaoyu168/article/details/80228390



    展开全文
  • android中的数据库操作

    万次阅读 多人点赞 2012-08-18 01:29:47
    android中的数据库操作  android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。   一、android内的数据库的基础知识介绍    1.用了什么数据库  android中采用的...

    android中的数据库操作

          android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。

     

    一、android内的数据库的基础知识介绍

     

           1.用了什么数据库


                android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的。相关简介可以从链接查看。

     

           2.数据库基本知识观花


                对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念、基本语句快速的了解一下,是很有必要的,这样待会用Android的database相关方法去执行一些数据库语句时就不会茫然了。

     

           ①数据库的基本结构——表格

     

           表格是数据库中储存资料的基本架构。表格被分为栏位 (column) 及列位 (row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。每一个表格拥有一个独一无二的名字(Table Name)以便能够让用户定位到它上面。一个典型的表格结构如下:

     

       Store_Information 表格

    store_name Sales Date
    Los Angeles $1500 Jan-05-1999
    San Diego $250 Jan-07-1999
    Los Angeles $300 Jan-08-1999
    Boston $700 Jan-08-1999
     该表格的表格名字为Store_Information,一共有三个栏位,分别为store_name , Sales , Data ,已经录入了四笔数据所以有四个列位。

     

           ②关于数据类型

     

           和其他的数据库不同的是,sqlite是无类型的。也就是当你创建一个表格时,无需对每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite会自动找到存入的数据的类型。

     

           SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如VARCHAR、NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。这些数据类型都是SQL92标准中规定的标准数据库数据类型,想要有更近一步了解,请参看下表。

     

    SQL数据库数据类型详解

    数据类型
    类型
    描             述
    bit
    整型
    bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
    int
    整型
    int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
    smallint
    整型
    smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
    tinyint
    整型
    tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节
    numeric
    精确数值型
    numeric数据类型与decimal 型相同
    decimal
    精确数值型
    decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
    money
    货币型
    money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一
    smallmoney
    货币型
    smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
    float
    近似数值型
    float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
    real
    近似数值型
    real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
    datetime
    日期时间型
    datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
    Smalldatetime
    日期时间型
    smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
    cursor
    特殊数据型
    cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
    timestamp
    特殊数据型
    timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
    Uniqueidentifier
    特殊数据型
    Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
    char
    字符型
    char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
    varchar
    字符型
    varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
    text
    字符型
    text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
    nchar
    统一编码字符型
    nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
    nvarchar
    统一编码字符型
    nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
    ntext
    统一编码字符型
    ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
    binary
    二进制数据类型
    binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
    varbinary
    二进制数据类型
    varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
    image
    二进制数据类型
    image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

     

    你或许已经在纳闷了,为什么之前的数据类型是大写的,而到了这个表格就变成了小写的。其实这是sqlite的一个不得不提的特性:sqlite是大小写不敏感的!这一特性对于很多c语言fans来说是很不习惯的。

     

            ③数据库的基本操作语句


           其实这个还是SQL92标准中的一部分,只是不同的数据库会有一点点的不同而已,下面就对在android中最常用的几个操作语句给以概述,详细介绍请参看SQL语句简单介绍

     

    (1)CREATE TABLE

           由于创建一个表格,基本使用语法结构是:

    CREATE TABLE "表格名" ("栏位1" 保存资料类型 , "栏位3"  保存资料类型  , "栏位2" 保存资料类型 .....);

           例如我要创建刚才的Store_Information表格,就可以这样:

    CREATE TABLE  Store_Information (Store_Name char[50] , Sales long , Date date );  

           需要提示的是,这里还是声明了数据类型。而且不难发现,c语言构建的sqlite自身也有一些c语言的性格(例如一个完整语句后的分号)。

     

     

    (2)SELECT

    用于将资料从数据库中的表格内选出,基本语法结构为:

    SELECT "栏位名" FROM "表格名" ;

    例如我想将 Store_Information 里面的store_name 选出,则可以这样:

    SELECT store_name FROM Store_Information ;

     

    这句执行后就会显示如下的信息:

     

     

    store_name
    Los Angeles
    San Diego
    Los Angeles
    Boston

     

     

    好了,效果一目了然。

     

    (3)SELECT语句可以添加条件来缩小选择结果:

     

     

    去掉重复的结果:

     

    SELECT DISTINCT "栏位名" FROM "表格名" 

    例如将刚才的语句改为:

    SELECT DISTINCT store_name FROM Store_Information ;

     

    则显示的结果为:


    store_name

    Los Angeles
    San Diego
    Boston

     

    实现有条件的筛选:

     

    SELECT "栏位名" FROM "表格名" WHERE "条件语句" ;

     

    条件语句和c语言中的类似,只不过用AND表示“且”,OR表示“或”。

     

    例如对表执行如下语句:

     

    SELECT store_name FROM Store_Information WHERE Sales > 1000 ;

     

    则显示结果为:

     

     

    store_name

     

    Los Angeles

     

     

    其中WHERE语句用的较多,因为它可以实现自定义条件的使用和多条件的组合。

     

    (4)INSERT INTO

     

    在表格中加入资料——可以实现一笔的加入和多笔的加入。

     

    加入一笔:

    INSERT INTO "表格名" ("栏位1", "栏位2", ...) VALUES ("值1", "值2", ...);


    加入多笔:

    INSERT INTO "待加入数据的表格" ("栏位1", "栏位2", ...) SELECT "栏位3", "栏位4", ... FROM "被加入的表格" ;

     

    加入多笔其实就是将另一个表格加入到现有表格中。

     

    (5)UPDATE

     

    用于修改表格中的数据,语法结构为:

     

    UPDATE "表格名" SET "栏位1" = [新值] WHERE {条件};

     

    例如:

     

    UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" ;

     

    具体是什么意思的话就不说了,你懂的~~~

     

    (6)DELETE FROM

     

    删除表格中的某些数据,语法结构为:

     

    DELETE FROM "表格名" WHERE {条件} ;

     

    满足条件的所有资料都会被删除掉。

     

     

     

    二、如何在android中调用数据库资源


    在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作。其中前者主要用于在开发过程中进行调试等工作,后者则为android中主要的使用数据库的方式。

    下面就对这两种方式进行一个简要的介绍。

     

    1.adb shell方式

     

    说白了,adb shell 就是一个android模拟器的后台资源调用器(个人理解啦~~)。它的操作方式和命令提示符差不多——以命令行的方式进行。

     

    既然是模拟器的后台资源调用器,那当然得先打开android模拟器了。

     

    打开模拟器后,再打开命令提示符,在里面输入adb shell,这时会出现一个#号(懂linux的同学懂的),具体效果如下:

     

    然后你就可以像在linux下进行shell命令的执行了。

     

    接着输入 cd data/data/ 并执行,再执行ls,则会显示一些安装的软件的工程包名,效果如下:

     

     

    其实这在模拟器中是以一个个文件夹的形式存在的,所以你可以用cd命令进入它。例如我进入一个后,再用ls命令显示里面的内容:

     

     

    该文件夹内又存在databases、 lib等文件夹(如果没有databases的话可以自己手动用mkdir命令创建一个)。而这个databases文件夹就是这个应用的数据库文件的所在地,cd进入后,应该会看到里面有一个或多个.db格式的文件(其实sqlite对文件的名字没有特殊要求,你用.txt等其他的格式也可以,但推荐.db)。如果没有db文件的话,可以用如下命令创建:sqlite3 mydata.db。这样就会在databases里面生成了一个数据库文件。如果已存在,可以直接用sqlite3命令调用该数据库文件,命令为 sqlite3 mydata.db(其实就是和刚才的命令一个样)。接下来你就会看到:

     

     

    在sqlite>后面就可以执行你的sql语句了。下面执行了一些简单的语句:

     

     

    好了,adb shell的方式介绍到这里。

     

    2.通过android中的相关java类

     

     

          Android中对数据库进行操作的相关的借口、类等都在andorid.database和android.database.sqlite两个包里面。里面存在着很多的与数据库操作相关的类,但是在平时普通的开发中最经常遇到的仅仅就是那几个类而已,所以在这里我就省去通篇的介绍,对一些常用的接口、类做一下简介。

     

    SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

     

    文档信息:

    public class

    SQLiteDatabase

     

    Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.

     

     

    简介:

    这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。

     

    重要方法介绍:

     

    (1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

         public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)

    这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory则是一个产生Cursor对象的工厂类(Cursor接口将在后面介绍到)。


    (2)public long insert (String table, String nullColumnHack, ContentValues values)

    看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。


    (3)public int delete (String table, String whereClause, String[] whereArgs)

    不用说了,用于删除表中的数据。


    (4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

    名字很长是吧,它的功能也很强大,用于查询数据库中的数据。


    (5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)

    用于修改数据。根据传入参数的名字可以对使用方法略知一二。


    (6)public void execSQL (String sql, Object[] bindArgs)

         public void execSQL (String sql)

    这是我个人认为最为重要的方法。这个方法用于执行你用String表示的非查询(因为它不会返回一个Cursor对象)的sql语句,例如CREATE,SELECT等。遗憾的是现在尚无法一次调用该方法来执行用“;”分开的多条sql语句。第二个重写方法使用的更多些。

    另外在此提问:第一个重写方法中bindArgs表示的是一些什么,用来做什么用,知道的同学可以告诉我下,谢谢!

    在第一个方法中,bindArgs这个参数是用来传入前一句的sql语句中未定义的参数的。例如 :

    sql = "INSERT INTO some_table (Id, Name, Source, Filter, Target) VALUES (?,?,?,?,?)"

    bindArgs = new String[]{"1", "Winiex", "some_source", "some_fileter", "some_target"}

    在这个时候,bindArgs中的参数就会bind(绑定)到前一句的sql语句中,最终的被执行的sql语句就会变成:

    INSERT INTO some_table (Id, Name, Source, Filter, Target) VALUES (1, "Winiex", "some_source", "some_filter", "some_target")

    感谢wantalcs朋友的帮助! :)想更进一步地知道这个问题的解答,请朋友们移步29楼~。


    (7)public void close ()

    用来关闭数据库并释放数据库占用的相关资源。


     

    SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)

     

    文档信息:

    public abstract class

    SQLiteOpenHelper

    A helper class to manage database creation and version management. You create a subclass implementingonCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

     

    简介:

    正如它的名字所表述的一样,这个抽象类是一个辅助类(Helper),用来打开(若数据库已存在)或创建数据库的。关于抽象类我们都知道,如果要使用它,一定是继承它。所以使用它都是通过自己定义一个类继承于它,并实现onCreate(SQLiteDatabase) onUpgrade(SQLiteDatabase, int, int) onOpen(SQLiteDatabase)三个方法。

    在我看来,所谓的辅助类,其实就是充当了一个封装器——也就是说用于对其辅助的类实现一个java上的封装。在这里,SQLiteOpenHelper就是用来对SQLiteDatabase进行一个封装处理。初学的同学想要进一步理解的话可以先看看什么是封装

     

    它包含的方法如下:

     

    (1)synchronized void close()

          关闭任何已开启的数据库对象。

    (2)synchronized SQLiteDatabase getReadableDatabase()

          创建或打开一个仅仅可读的(read-only)数据库。

    (3)synchronized SQLiteDatabase getWritableDatabase()

          创建或打开一个可读可写的数据库。
    (4)abstract void onCreate(SQLiteDatabase db)
          当数据库被第一次创建时被调用的的方法(类似于Activity的onCreate())。
    (5)void onOpen(SQLiteDatabase db)
          数据库已经被成打开后被调用。
    (6)abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
          当数据库需要被更改(更新)时被调用。
     

     

    Cursor(android.database.Cursor)

     

    文档信息:

    public interface

    Cursor

    This interface provides random read-write access to the result set returned by a database query.

     

    简介:

    Cursor没有构造方法,只能通过query方法获得。

    前面提到了,execSQL方法无法执行与查询相关的sql语句,是因为无法返回一个Cursor对象——查询需要将查到的结果(就是表中的哪一行满足查询条件)返回,execSQL是返回void的,所以无法操作查询语句。从这里可以了解到,Cursor接口从某种意义上说就是为了弥补这一点的——query方法就是返回了一个Cursor对象。从名字上看,它的意思是游标,所以大概可以猜到他起到了一个指代的作用(事实上就是的,它指代数据库中保存数据的表的一行,并且还可以简单的处理该行数据项的信息)。从类的描述看,Cursor提供了对一个数据库查询动作返回结果束的随机读写途径,也就是说,它是一个对查询操作返回结果进行进一步处理的类,而这些处理就是用Cursor里的方法实现的。

    结合SimpleCursorAdapter这个适配器类,你可以很方便的将数据库中的数据显示到AdapterView(例如ListView,GridView)中——这也是Cursor的另一大用处。

    如果你了解java中的迭代器(Iterator)的话你就会发现其实Cursor和迭代器有些相似,这样你可能会更快的了解Cursor

     

    一些常用的方法有:

    (1)public abstract boolean moveToPosition (int position)

        public abstract boolean moveToFirst ()

        public abstract boolean moveToLast ()

        public abstract boolean moveToNext ()

        public abstract boolean moveToPrevious ()

    把这些方法放在一起的目的很明显:它们都是对Cursor指向的位置进行操作的方法——移到某个指定的位置、移到第一行、移到最后一行、移向下一行、移向上一行等等。

     

    (2)public abstract int getCount ()

    返回Cursor指向的表含有的总数据项数。

     

    (3)public abstract boolean requery ()

    Cursor是被一个query方法产生的,而这个方法就是将那个query方法所做的查询动作再执行一遍——这将会改变调用该方法的Cursor对象的值,也就是说,Cursor使用了该方法后就复位了。

     

    (4)public abstract boolean isClosed ()

        public abstract boolean isFirst ()

        public abstract boolean isLast ()

        public abstract boolean isNull (int columnIndex)

        public abstract boolean isClosed ()

        public abstract boolean isAfterLast ()

        public abstract boolean isBeforeFirst ()

    在java中,类似于isWhatever形式的方法大都是对对象状态进行判断的方法——Whatever成立则返回true,不成立则返回false。这些方法也不例外。

    值得提一下的是isNull方法,该方法测试某个栏位所保存的信息是否为NULL。参数columnIndex代表了那个栏位的代号。

     

    ④另外建议各位了解一下SimpleCursorAdapter(android.widget.SimpleCursorAdapter)这个适配器类。

     

     

     

    好了,介绍这么多了,该上源码了。这个源码很简单,但代表一种使用模式,所以还是值得仔细研究的。

     

    1.实现一个继承SQLiteOpenHelper的类

     

    2.创建一个录入数据的类

     

     

    3.创建一个显示数据库数据的类

     

     

     

     

    在这些代码中,关键理解第一个的思想以及形式即可,其他都是基于它进行的一些操作而已。另外布局的代码就不加了,没啥技术含量。

     

    国庆节没有回家,抽了点时间写了这篇博文,希望看完了的同学不吝赐教,指出不足,谢谢。

    另外,表达一下因为没回家对爸妈的歉意——儿在奋斗呢,别担心。

    展开全文
  • android连接数据库实例

    千次下载 热门讨论 2020-07-30 23:32:42
    android连接数据库的实例,包括webservice端的代码和数据库的格式和代码,希望对需要的人有帮助
  • Android】实现登录、注册、数据库操作(极简洁)

    万次阅读 多人点赞 2020-06-14 19:56:53
    我最近又写了一篇文,是这篇文章的升级版,借此文引流一下: ...(2019-12-05更新:我已经把Gradle更新到3.5最新版了,dependencies也已经都迁移到androidx了,特此说明) https://github.com/littlecurl/AppProj...

    终于,尽管走下去,不必逗留着......

             我终于录视频了:《【Android】登录注册(简洁版)》

             —— 赞美无风险,吐槽别谨慎。


    我最近又写了一篇文,是这篇文章的升级版,借此文引流一下:

    《【Android】实现登录、注册、数据库操作(极复杂)》


    本篇源码地址(进去找JustLoginRegister):

    (2019-12-05更新:我已经把Gradle更新到3.5最新版了,dependencies也已经都迁移到androidx了,特此说明)

    https://github.com/littlecurl/AppProjects

    源代码里面有详细注释,切记要改一下gradle的版本号为本地gradle版本号,否则AndroidStduio会自行下载,浪费时间。


    忙着敲代码,忙着忙着就忘了吃中午饭了,两点半了才想起来,下不为例!

    这一篇我写的是用Android实现登录、注册、数据库操作的相关内容。

    先放最终效果图:

     

     

     

    先声明一下我的AndroidStudio的版本是:

              是时候写正文了!

              首先,当我们用AndroidStudio运行写好的Android程序的时候,也就是说,当按下那个绿色的小三角,启动小手机的时候,整个AndroidStudio会发生什么事情?这件事重要到,不搞清楚就学不会Android编程的地步。

                                                                     

      

            没错,就是你看到的这两个图标,折磨你到半死不活的两个玩意。

            当你熬到深夜两点,拖着疲惫的身躯敲完最后一行代码,颤颤巍巍的右手握着鼠标,眯瞪着双眼瞄准绿色的小三角,用尽平生最后一丝力气狠狠地单击一下鼠标左键 ,然后整个人葛优瘫在键盘上等待着它的运行,它到底发生了什么事情?这一切的背后,是人性的扭曲还是道德的沦丧?啊呸,重来。这一切的背后,是怎样的逻辑结构和运行原理?

            我尽我最大的努力来阐释一下我对此过程的拙见。

            首先看一下我这个Android程序的三级目录

     

            我已经标注好顺序了 0 → 1 → 2 → 3 → 4 总共5步

    步骤 0

    编译,具体Gradle是个啥,我也不清楚,我只知道Android是用Gradle进行编译的,编译的过程它会

    一、检查Gradle自身程序是否可用或版本是否最新

    二、启动各种我们桌面上看不见的程序,如果我没猜错的话,Gradle和Java、Python都差不多,大概就是一些java.exe、javac.exe之类的

    三、匹配各种依赖项,存在的检查完整性,不存在的去指定网站下载

    步骤 1

    解析注册XML,AndroidManifest.xml在Android中的作用和Windows中的注册表类似,每个Activity.java都需要去注册,而且里面有MAIN和LAUNCH设置,MAIN是:主要、入口的意思;LAUNCH是:启动、加载的意思。也就是说,AndroidManifest.xml是个导游,告诉AndroidStudio从哪开始运行,都有什么大致内容。

     步骤 2

    运行Activity,所谓Activity 翻译为 :活动、界面  一个Activity就是一个运行界面,AndroidStudio会启动在AndroidManifest.xml中被设置为 MAIN和LAUNCH 的Activity。首页启动之后,就是各个Activity之间的跳转通信了。

    步骤 3

    解析布局XML,在每个Activity创建(onCreate)时都会加载自己的xml布局文件,这些xml布局文件定义了对应Activity长什么样子。

    步骤 4

    解析完布局XML后,每个Activity的模样就确定了,然后就会返回Activity中执行类似响应点击、滑动之类的操作的代码

     

    源码下载地址:https://gitee.com/littlecurl/AppProjects/raw/master/JustLoginRegisterTest.zip

     

     

    大家加油!!!


     .


    看完如果觉得不错,留个赞再走。


    .

     

     

     

    展开全文
  • AndroidAndroidStudio3.0+保存并查看SQLite数据库文件

    万次阅读 多人点赞 2020-06-14 19:59:59
    吐槽一下: 我从知乎、简书、CSDN、掘金、GitHub搜遍了,方法是有,可是那个软件收费。于是迫不得已,我就趁着月黑风高,翻过墙头,Google了一下,也是,找了老半天,要么是我关键词用的不对,要么就是那些大神们...

    终于,尽管走下去,不必逗留着......

             我终于录视频了:《【Android】登录注册(简洁版)》

             —— 赞美无风险,吐槽别谨慎。


    吐槽一下:

           我从知乎、简书、CSDN、掘金、GitHub搜遍了,方法是有,可是那个软件收费。于是迫不得已,我就趁着月黑风高,翻过墙头,Google了一下,也是,找了老半天,要么是我关键词用的不对,要么就是那些大神们都不屑于写这些步骤,终于在我打算翻墙头回来睡觉的时候,在关闭随手打开一堆网页的最后一个的时候,I get it !

    防砸声明:

           前方多图,高能预警。

    在开始正式步骤之前,先说明我的AndroidStudio版本是2018/7/9凌晨2点为止最新版:

    AndroidStudio3.2-beta2

    别介你用着其他版本整不出来,然后拿着砖头来砸我,我已经说明版本了,那时候我可是要抄起来我的拖鞋正当防卫的。

     

    正文:

    1.打开AndroidStudio3.0+,Open一个操作数据库的项目

            这一步就不给图片了

    2.运行项目->往数据库中插入数据。比如我这里注册一个用户:

     

     

     

    3.然后返回AndroidStudio->View->Tool Windows->Device File Explorer(算是最关键的一步吧,如果你的AndroidStudio没有这个选项,那就凉了)

     

     其实右下角有一个快捷键,可以直接打开

    4.点击后会在右边出来一个框框,找到data->data->你自己项目的包名(可以从左边目录树java文件夹看到自己当前项目的包名)

    注意是data->data!!

     

     

    如果你打开的APP确实有执行过sqlite数据库相关操作,但是就是没有看到database目录,你可以尝试右键包名,然后Synchronize一下,些许就出来了,如果还没有,那就想办法联系我,我倒要看看是个什么神奇的APP。 

     

    5. 右键找到的包名->Save As.. ->选择保存路径(我图个方便就先放到桌面了)-> 点击ok

     

     

     

    6. 回桌面看一眼已经保存下来了(数据库就在database文件夹里面)

    (现在已经完成保存的任务了,接下来是数据库查看内容)

    (其实另外两个是没有必要存下来的,只需要保存下来database就行了,但也不能保存少了,如果只保存database里面的.db是看不到数据的,具体参考:另一篇文章

     

     

    (壁纸来源:http://www.runoob.com/w3cnote/17-wallpaper-for-programmer.html)

     

    7.要想查看数据库内容,先打开我一起打包发给你的另一个文件夹:SQLiteStudio

    (看清了,不是AndroidStudio)这里面有一个开源软件SQLiteStudio,打开。

    SQLiteStudio下载链接:https://pan.baidu.com/s/1Ji6xkhYxrWP8pDk6qba_Og

     

     

     

     

    8. 点击左上角数据库->添加数据库->点小文件夹图标->找到你刚才保存的路径下的database文件夹->右下角选择所有文件(这一步很重要)->选择你创建的数据库->点击ok

     

     

     

     

     

     

     

     (其实,这个软件支持像PS打开图片那样,直接拖动.db文件到这个软件的图标,即可打开!)

    9.如果不出意外SQLiteStudio的左边栏已经有数据库了->如果左边没有出现,那么可以点击查看->数据库->左边就会出来一个小边边。

    10.然后就是双击数据库->双击Tables->双击你自己创建的表->你一看,空的,很是失望。->emmmm…Don't Panic!点击  数据->哇咔咔,出来了!!!

    (如果你按照上面的操作来到这里,发现还是没有数据,我猜是你少保存东西了。参考另一篇文章

     

     

    到此结束,两点半了,该睡觉了,明天还要考试呢。

     

    参考文章:

    点击打开链接

    .


    看完如果觉得不错,留个赞再走。


    .

     

     

     

     

    展开全文
  • Android】SQLite数据库基本用法详解(极简洁)

    万次阅读 多人点赞 2020-06-14 19:58:24
    Android操作SQLite数据库(极简洁,极易懂) 本篇源码地址: https://github.com/littlecurl/AppProjects 源代码里面有详细注释,切记要修改一下gradle的版本号为本地gradle版本号,否则AndroidStduio会自行下载...
  • Android 数据库对比

    千次阅读 2019-01-09 11:57:40
    Android 数据库对比 转载于:https://blog.csdn.net/u010134293/article/details/58590092 一、常见数据库介绍 GreenDao 是为Android设计的对象关系映射(ORM)工具。它提供了对象到关系型数据库SQLite的相应...
  • Android数据库使用指南(上)

    千次阅读 2018-09-14 10:58:48
    Android上的数据库是sqlite,虽然这个数据库是轻量级的,但是储存的东西可不少,sqlite官方表示理论存储容量为140TB,目前应该没有那么大容量的手机,存储能力太强了。 关于如何使用SQLite,老实说,都在android....
  • 安卓常用数据库

    千次阅读 2019-05-08 16:12:26
    DBFLOW: 因为它综合了各个数据库的框架的优点,它比GreenDao要使用简单, 同时又比ActiveAndroid性能高很多,它是一款操作简单又高效的ORM框架。 3.ObjectBox:https://www.jianshu.com/p/e4ebaa...
  • 如何在android studio 中查看数据库

    万次阅读 2018-09-01 20:47:19
    最近对android数据库那一块刚入门,首先学了下怎么创建数据库然后在android studio中查看自己创建的数据库,刚刚开始自己有点懵逼,但是我还是慢慢百度下学会了,至此写下自己的心得,希望对初学者有点帮助。...
  • android studio 中查看数据库

    万次阅读 2015-10-22 16:26:14
    安装 SQLSOUT 插件,直接在 android studio 中 查看数据库文件 下载地址: http://www.idescout.com/ File->settings->plugins->install plugin from disk->选择下载好的压缩包 安装后重启,在 tool windows ...
  • Android studio查看SQLIte数据库文件

    万次阅读 2016-12-15 18:27:16
    最近在做SQLIte,建表以后,却无法找到数据库文件用模拟器测试,在Eclipse中打开DDMS ——>File Explorer——>data——>data——>对应包下——>databases就能看到数据库文件了,然后导出到桌面,用SQLite Expert查看...
  • android studio使用database navigator查看数据库

    万次阅读 多人点赞 2017-12-27 08:38:26
    database navigator是android studio的一个插件,可以用来查看sqlite数据库,也可以查看MySQL等其他数据库。 二 安装插件 1、file -> setting 2、搜索并安装插件 3、安装完成后会提示重启android studio,重启...
  • Android Studio 连接 MySQL 云端数据库

    万次阅读 热门讨论 2017-11-24 15:53:47
    1、下载mysql驱动 'mysql-connector-java-*.*.*-bin.jar' 复制到 app目录下的 libs 目录中(如下图)。 2、添加依赖库 File | Project Stuctrue | app | dependencies | 点击第一行记录 {include *** } | 点右列 ...
  • 我用sqlite创建的数据库,要怎么查看我建的数据库文件在哪呢
  • 看到网上说SQLite数据库的大小是2TB,但是我觉得这个数据库不应该跟手机内存相联系吗? android上的SQLite数据库真的能容纳下2TB的数据吗???
  • android简单的创建了一个数据库,想知道能在哪个文件夹中找到这个数据库,按照张泽华视频写的,可是查找的时候视频上的文件夹打不开
  • Android数据库详解

    万人学习 2019-06-26 11:52:30
    本系列视频是对Android数据库进行详细讲解,包括创建数据库,执行增删改查,第三方的XUtils操作数据库使用。
  • Android查看数据库方法及工具

    万次阅读 2011-02-27 15:15:00
    Android查看数据库方法及工具
  • Ø 数据库整理方案如下: 一、Android+ webservices+SQLServer : 通过webservices客户端向指定服务器发送请求,服务器响应返回指定格式的数据,如json或者xml格式。 (数据库操作在服务器端完成)   参考文章: ...
1 2 3 4 5 ... 20
收藏数 191,406
精华内容 76,562
关键字:

android数据库