精华内容
下载资源
问答
  • Sqlite使用方法

    2019-02-21 11:36:33
    使用方法: import sqlite; conn = sqlite.conn(“数据库名”); # 得到一个数据库链接(数据库有则连接,无则创建) cursor = conn.cursor(); # 获得一个操作数据库的游标 # 创建表 c_t_sql = “create table if not...

    Sqlite是Python内置的一个轻量级数据库

    使用方法:
    import sqlite;
    conn = sqlite.conn(“数据库名”); # 得到一个数据库链接(数据库有则连接,无则创建)
    cursor = conn.cursor(); # 获得一个操作数据库的游标
    # 创建表
    c_t_sql = “create table if not exist 表名(字段 类型 其他, 字段 类型…)”;
    cursor.execute(c_t_sql);

    #  插入数据 
    insert_sql = "insert into 表名(要插入的字段名...)values(要插入的值...)";
    cursor.execute(insert_sql);
    
    # 删除数据
    de_sql = "delete from 表名 where 条件"; 
    cursor.execute(de_sql);
    
    # 更改数据
    up_sql= "update 表名 set 字段=新值 where 约束条件";
    cursor.execute(up_sql);
    
    # 查询数据
    view_sql = "select 字段名/* from 表名 where 约束条件";
    cursor.execute(view_sql);
    
    # 最后提交所有操作
    conn.commit();
    
    # 关闭游标和数据库连接
    cursor.close();
    conn.close();
    
    展开全文
  • Android中SQLite 使用方法详解 现在的主流移动设备像android、iPhone等都使用SQLite作为复杂数据的存储引擎,在我们为移动设备开发应用程序时,也许就要使用到SQLite来存储我们大量的数据,所以我们就需要掌握移动...
  • 我是做手游开发的,在手机上使用SQLite 存储数据是很方便的。  System.Data.SqLite实践前期准备 System.Data.SQLite 库下载,用于C#操作SQLite的dll文件。下载地址:...
  • 2.2 使用SQLiteHelper来创建数据库 3. 注意事项 1.Demo展示 Demo 案例:实现联系人列表功能,我们可以增加联系人,修改联系人,删除联系人,以及根据联系人的名字查询该联系人的功能,如下图所示: 增加联系人 ...

    目录

    1. Demo展示

    2. 实现方法

     2.1 定义数据库的结构

    2.2 使用SQLiteHelper来创建数据库

    3. 注意事项


    1. Demo展示

    Demo 案例:实现联系人列表功能,我们可以增加联系人,修改联系人,删除联系人,以及根据联系人的名字查询该联系人的功能,如下图所示:

    增加联系人
    查询联系人
    修改联系人
    删除联系人

    2. 实现方法

    app 的结构如下:(源码见 -> Android_SQLite_Learning

     2.1 定义数据库的结构

    package com.jere.android_sqlite_learning.model;
    
    /**
     * @author jere
     */
    public class BusinessCard {
        public static final String TABLE_NAME = "BusinessCard";
        public static final String COLUMN_ID = "id";
        public static final String COLUMN_AVATAR = "avatar";
        public static final String COLUMN_NAME = "name";
        public static final String COLUMN_GENDER = "gender";
        public static final String COLUMN_TELEPHONE = "telephone";
        public static final String COLUMN_ADDRESS = "address";
    
        public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COLUMN_NAME + " TEXT,"
                + COLUMN_GENDER + " INTEGER,"
                + COLUMN_AVATAR + " INTEGER,"
                + COLUMN_TELEPHONE + " TEXT,"
                + COLUMN_ADDRESS + " TEXT"
                + ")";
    
        private int id;
        private int avatar;
        private String name;
        private String telephone;
        //true:male, false:female
        private boolean gender;
        private String address;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getAvatar() {
            return avatar;
        }
    
        public void setAvatar(int avatar) {
            this.avatar = avatar;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public boolean getGender() {
            return gender;
        }
    
        public void setGender(boolean gender) {
            this.gender = gender;
        }
    
        public String getTelephone() {
            return telephone;
        }
    
        public void setTelephone(String telephone) {
            this.telephone = telephone;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    

    2.2 使用SQLiteHelper来创建数据库

    /**
     * @author jere
     */
    public class DataBaseHelper extends SQLiteOpenHelper {
        private static final int DATABASE_VERSION = 1;
        private static final String DATABASE_NAME = "business_card_db";
    
        public DataBaseHelper(@Nullable Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL(BusinessCard.CREATE_TABLE);
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            //drop old table if is existed
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + BusinessCard.TABLE_NAME);
            //create table again
            onCreate(sqLiteDatabase);
        }
    
        /**
         *
         * @param businessCard
         * @return 返回新插入的行的ID,发生错误,插入不成功,则返回-1
         */
        public long insertBusinessCard(BusinessCard businessCard) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(BusinessCard.COLUMN_AVATAR, businessCard.getGender() ? R.drawable.male_avatar_icon : R.drawable.female_avatar_icon);
            values.put(BusinessCard.COLUMN_NAME, businessCard.getName());
            values.put(BusinessCard.COLUMN_GENDER, businessCard.getGender() ? 1 : 0);
            values.put(BusinessCard.COLUMN_TELEPHONE, businessCard.getTelephone());
            values.put(BusinessCard.COLUMN_ADDRESS, businessCard.getAddress());
            long id = db.insert(BusinessCard.TABLE_NAME, null, values);
            db.close();
            return id;
        }
    
        /**
         *
         * @param searchName query database by name
         * @return BusinessCard
         */
        public BusinessCard getBusinessCardQueryByName(String searchName) {
            BusinessCard businessCard = new BusinessCard();
            SQLiteDatabase db = this.getReadableDatabase();
            String[] columnArray = new String[]{
                    BusinessCard.COLUMN_ID,
                    BusinessCard.COLUMN_NAME,
                    BusinessCard.COLUMN_GENDER,
                    BusinessCard.COLUMN_AVATAR,
                    BusinessCard.COLUMN_TELEPHONE,
                    BusinessCard.COLUMN_ADDRESS};
            Cursor cursor = db.query(BusinessCard.TABLE_NAME,
                    columnArray,
                    BusinessCard.COLUMN_NAME + "=? ",
                    new String[]{searchName},
                    null, null, null);
            if (cursor != null && cursor.moveToNext()) {
                int id = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_ID));
                String name = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_NAME));
                int portrait = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_AVATAR));
                String telephone = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_TELEPHONE));
                String address = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_ADDRESS));
                int gender = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_GENDER));
                businessCard.setId(id);
                businessCard.setName(name);
                businessCard.setAvatar(portrait);
                businessCard.setTelephone(telephone);
                businessCard.setAddress(address);
                businessCard.setGender(gender == 1);
    
                cursor.close();
                return businessCard;
            }
            return null;
        }
    
        /**
         *
         * @return 读取数据库,返回一个 BusinessCard 类型的 ArrayList
         */
        public ArrayList<BusinessCard> getAllBusinessCards() {
            ArrayList<BusinessCard> businessCardsList = new ArrayList<>();
    
            String selectQuery = "SELECT * FROM " + BusinessCard.TABLE_NAME
                    + " ORDER BY " + BusinessCard.COLUMN_ID + " ASC";
            SQLiteDatabase db = getReadableDatabase();
            Cursor cursor = db.rawQuery(selectQuery, null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    BusinessCard businessCard = new BusinessCard();
                    int id = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_ID));
                    String name = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_NAME));
                    int portrait = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_AVATAR));
                    String telephone = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_TELEPHONE));
                    String address = cursor.getString(cursor.getColumnIndex(BusinessCard.COLUMN_ADDRESS));
                    int gender = cursor.getInt(cursor.getColumnIndex(BusinessCard.COLUMN_GENDER));
                    businessCard.setId(id);
                    businessCard.setName(name);
                    businessCard.setAvatar(portrait);
                    businessCard.setTelephone(telephone);
                    businessCard.setAddress(address);
                    businessCard.setGender(gender == 1);
    
                    businessCardsList.add(businessCard);
                }
            }
    
            db.close();
            return businessCardsList;
        }
    
        /**
         *
         * @return 返回数据库行数
         */
        public int getBusinessCardCount() {
            String countQuery = "SELECT * FROM " + BusinessCard.TABLE_NAME;
            SQLiteDatabase db = getReadableDatabase();
            Cursor cursor = db.rawQuery(countQuery, null);
            int count = cursor.getCount();
            cursor.close();
            return count;
        }
    
        /**
         *
         * @param id update row id (需要更新的ID)
         * @param businessCard update value (去更新数据库的内容)
         * @return the number of rows affected (影响到的行数,如果没更新成功,返回0。所以当return 0时,需要告诉用户更新不成功)
         */
        public int updateBusinessCard(int id, BusinessCard businessCard) {
            SQLiteDatabase db = getWritableDatabase();
    
            ContentValues values = new ContentValues();
            values.put(BusinessCard.COLUMN_AVATAR, businessCard.getAvatar());
            values.put(BusinessCard.COLUMN_NAME, businessCard.getName());
            values.put(BusinessCard.COLUMN_TELEPHONE, businessCard.getTelephone());
            values.put(BusinessCard.COLUMN_ADDRESS, businessCard.getAddress());
            values.put(BusinessCard.COLUMN_GENDER, businessCard.getGender() ? 1 : 0);
            int idReturnByUpdate = db.update(BusinessCard.TABLE_NAME, values, BusinessCard.COLUMN_ID + " =? ", new String[]{String.valueOf(id)});
            db.close();
            return idReturnByUpdate;
        }
    
        /**
         *
         * @param id the database table row id need to delete(需要删除的数据库表中行的ID)
         * @return 返回影响到的行数,如果在 whereClause 有传入条件,返回该条件下影响到的行数,否则返回0。
         * 想要删除所有行,只要在 whereClause 传入 String "1",并返回删除掉的行数总数(比如:删除了四行就返回4)
         */
        public int deleteBusinessCard(int id) {
            SQLiteDatabase db = getWritableDatabase();
            int idReturnByDelete = db.delete(BusinessCard.TABLE_NAME, BusinessCard.COLUMN_ID + "=? ", new String[]{String.valueOf(id)});
            db.close();
            return idReturnByDelete;
        }
    
        /**
         * 删除所有行,whereClause 传入 String "1"
         * @return 返回删除掉的行数总数(比如:删除了四行就返回4)
         */
        public int deleteAllBusinessCard() {
            SQLiteDatabase db = getWritableDatabase();
            int idReturnByDelete = db.delete(BusinessCard.TABLE_NAME, String.valueOf(1), null);
            db.close();
            return idReturnByDelete;
        }
    }
    

    3. SQLite 升级版本

    在上方的 Demo 中 onUpgrade() 方法中我们可以发现,当数据库升级时我们采用了最简单粗暴的方法,删除重建表,但在实际开发中需要严谨的对待数据库migration,一旦造成用户数据丢失,将是很差的用户体验。

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        /**在很多Demo中为了简单,直接删除重建表
        //drop old table if is existed
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + BusinessCard.TABLE_NAME);
        //create table again
        onCreate(sqLiteDatabase); **/
    
        //但在实际开发中需要严谨的对待数据库migration,一旦造成用户数据丢失,是很差的用户体验。
        if (oldVersion < 2) {
            upgradeVersion2(sqLiteDatabase);
        }
    }
    
    private void upgradeVersion2(SQLiteDatabase db) {
        db.execSQL("ALTER TABLE " + BusinessCard.TABLE_NAME + " ADD COLUMN " + BusinessCard.COLUMN_COMMENT + " TEXT");
    }
    
    /** 而且实际开发中,要面对着很多的升级,从1升到2,然后2到3,3到4. **/
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
             db.execSQL(upgradeDatabaseToVersion2Sql);
        }
        if (oldVersion < 3) {
             db.execSQL(upgradeDatabaseToVersion3Sql);
        }
        if (oldVersion < 4) {
             db.execSQL(upgradeDatabaseToVersion4Sql);
        }
    }

    关于 onUpgrade() 方法,官方说法是:

    /**
    在数据库版本升高时就会被触发,即在数据库需要升级时调用。使用此方法来做删除表、添加表或执行升级到新数据库结构版本所需的任何其他操作,从而实现升级。
    关于 ALTER TABLE 的操作可以点击“http://sqlite.org/lang_altertable.html”链接来查看详细内容,如果添加新列,可以使用ALTER TABLE将它们插入活动表。如果重命名或删除列,可以使用ALTER TABLE重命名旧表,然后创建新表,然后用旧表的内容填充新表。
    这个方法在一个事务中执行。如果抛出异常,所有更改将自动回滚。
     * @param db The database.
     * @param oldVersion The old database version.
     * @param newVersion The new database version.
     */
    public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

    4. SQLite 降级版本

    有升级就有降级,当然在实际应用中使用的很少,比如:我们将 DATABASE_VERSION 从 3 改为 2 , 自动触发 onDowngrade() 方法,如下所示:

    //测试一下回滚DB, 数据库降级,数据库版本从3降到2
        @Override
        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (oldVersion > 2) { //DATABASE_VERSION == 3
                db.execSQL("DROP TABLE IF EXISTS company");
            }
    //        super.onDowngrade(db, oldVersion, newVersion);
        }

    5. 注意事项

    因为数据库的操作是耗时操作,所以你不应该在主线程中进行数据库的操作,将 getWritableDatabase() 和 getReadableDatabase() 放到后台线程中处理,比如利用 AsyncTask 或 IntentService 来进行数据库的操作。如下利用 AsyncTask 来进行删除的操作:

    private static class DeleteBusinessCardAsyncTask extends AsyncTask<Integer, Void, Void> {
    
        private WeakReference<Context> contextWeakReference;
    
        DeleteBusinessCardAsyncTask(Context context) {
            contextWeakReference = new WeakReference<>(context);
        }
    
        @Override
        protected Void doInBackground(Integer... integers) {
            Context context = contextWeakReference.get();
            if (context != null) {
                new DataBaseHelper(context).deleteBusinessCard(integers[0]);
            }
            return null;
        }
    }

     

    源码见 -> Android_SQLite_Learning

    展开全文
  • 主要为大家详细介绍了python使用sqlite3时游标的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • C++ Sqlite3的使用方法

    2020-12-17 04:06:15
    SQLite3简介 SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。 SQL语句是SQL操作的指令,我们用C/C++...
  • 本文实例讲述了C#中增加SQLite事务操作支持与使用方法。分享给大家供大家参考,具体如下: 在C#中使用Sqlite增加对transaction支持 using System; using System.Collections.Generic; using System.Data; using ...
  • sqlite3使用方法

    万次阅读 多人点赞 2019-09-06 22:20:46
    sqlite3非常小,轻量级,就几百K大小;不需要用户名,密码,直接就可以对数据库进行操作。 二、安装sqlite3 1.安装sqlite3 sudo apt-get install sqlite3 2.安装库文件 sudo apt-get install libsqlite3-dev ...

    一、简介

    sqlite3非常小,轻量级,就几百K大小;不需要用户名,密码,直接就可以对数据库进行操作。

    二、安装sqlite3

    1.安装sqlite3

    sudo apt-get install sqlite3

    2.安装库文件

    sudo apt-get install libsqlite3-dev

    不安装库文件的话,直接在C语言中包含头文件#include<sqlite3.h>的话,会报错,

    三、sqlite3简单用法

    https://www.runoob.com/sqlite/sqlite-installation.html  

    https://blog.csdn.net/Gplusplus/article/details/52086443

    1.查看版本信息:sqlite3 -version

    2.进入sqlite3:直接输入sqlite3回车即可,和进入python一样

    3.退出sqlite3:.quit(sqlite比较独特的是,很多命令前都加了一个'.')

    4.创建数据库:sqlite3 databasename.db(注意直接在shell中输入这条语句,不要在sqlite3环境中输入)

    创建的数据库名后面一班加上.db,它会在当前目录下创建一个数据库文件databasename.db

    好像创建数据库之后,得查看一下或者干点别的,不能直接.quit退出,不然会发现没有建立数据库文件。

    5.查看数据库列表:.databases

    我这里只显示main,不知道什么意思,是没有显示全的意思么?还有输入.database和.databases显示的一样。

    6.删除数据库:直接把目录下的数据库文件删除就可以了。

    7.选择数据库:.open +数据库名

    这里如果数据库存在的话,就选择这个数据库;如果数据库不存在的话,系统会创建一个数据库test.db,然后选中这个数据库。

    8.创建表(需要先选中数据库),和mysql中差不多

    CREATE TABLE Student(

    ID INT PRIMARY KEY NOT NULL,

    NAME VARCHAR(20),

    AGE INT);

    9.查看数据库中有哪些表:.tables

    10.查看表的字段信息:.schema+表名

    11.删除指定的表:drop table +表名

    12.其他增删查改操作和mysql中一致。例如查找:

    select * from student where ID=1;

    13.调整显示

    四、Linux下C语言操作Sqlite

    https://blog.csdn.net/zouleideboke/article/details/73649886

    http://blog.sina.com.cn/s/blog_4c7c21a9010009bm.html

    https://blog.csdn.net/qq_43684922/article/details/90107557

    https://bbs.csdn.net/topics/390088709?list=26597021

    https://blog.csdn.net/weixin_43094387/article/details/86534423

    sqlite3的函数手册可以去https://www.sqlite.org 官网查看,Document-> Programming Interfaces->Introduction to the C/C++ API 或者Document-> Programming Interfaces->C/C++ API Reference。

    sqlite3就是一个结构体

    typedef struct sqlite3 sqlite3;

    1.打开数据库函数接口

    SQLITE_API int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
    );

    参数:filename:很明显就是要打开的数据库的名称,如果数据库不存在的话,会自动建立一个

    参数:ppDb:sqlite3数据库操作句柄,最开始定义sqlite3 *db=NULL,然后将&db传递给ppDb,使db指针指向打开的数据库连接对象。

    sqlite3 *db;db就是一个指向数据库的指针,可以把db当成一个对象,sqlite3_open()等就像构造函数,sqlite3_close()等就像析构函数。

    Each open SQLite database is represented by a pointer to an instance of the opaque structure named "sqlite3". It is useful to think of an sqlite3 pointer as an object. The sqlite3_open(), sqlite3_open16(), and sqlite3_open_v2() interfaces are its constructors, and sqlite3_close() and sqlite3_close_v2() are its destructors. There are many other interfaces (such as sqlite3_prepare_v2(), sqlite3_create_function(), and sqlite3_busy_timeout() to name but three) that are methods on an sqlite3 object.

    返回值:成功返回SQLITE_OK,错误返回情况很多。

    #define SQLITE_OK           0   /* Successful result */
    /* beginning-of-error-codes */
    #define SQLITE_ERROR        1   /* Generic error */
    #define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
    #define SQLITE_PERM         3   /* Access permission denied */
    #define SQLITE_ABORT        4   /* Callback routine requested an abort */
    #define SQLITE_BUSY         5   /* The database file is locked */
    #define SQLITE_LOCKED       6   /* A table in the database is locked */
    #define SQLITE_NOMEM        7   /* A malloc() failed */
    #define SQLITE_READONLY     8   /* Attempt to write a readonly database */
    #define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
    #define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
    #define SQLITE_CORRUPT     11   /* The database disk image is malformed */
    #define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */
    #define SQLITE_FULL        13   /* Insertion failed because database is full */
    #define SQLITE_CANTOPEN    14   /* Unable to open the database file */
    #define SQLITE_PROTOCOL    15   /* Database lock protocol error */
    #define SQLITE_EMPTY       16   /* Internal use only */
    #define SQLITE_SCHEMA      17   /* The database schema changed */
    #define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */
    #define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */
    #define SQLITE_MISMATCH    20   /* Data type mismatch */
    #define SQLITE_MISUSE      21   /* Library used incorrectly */
    #define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
    #define SQLITE_AUTH        23   /* Authorization denied */
    #define SQLITE_FORMAT      24   /* Not used */
    #define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */
    #define SQLITE_NOTADB      26   /* File opened that is not a database file */
    #define SQLITE_NOTICE      27   /* Notifications from sqlite3_log() */
    #define SQLITE_WARNING     28   /* Warnings from sqlite3_log() */
    #define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
    #define SQLITE_DONE        101  /* sqlite3_step() has finished executing */

    2.错误信息

    SQLITE_API const char *sqlite3_errmsg(sqlite3*);

    The sqlite3_errmsg() return English-language text that describes the error,返回描述错误的英文描述。

    2.关闭数据库

    SQLITE_API int sqlite3_close(sqlite3*);

    非常简单,直接把sqlite3指针传递过来,把数据库内存释放即可。

    3.执行sql语句

    SQLITE_API int sqlite3_exec(
      sqlite3*,                                  /* An open database */
      const char *sql,                           /* SQL to be evaluated */
      int (*callback)(void*,int,char**,char**),  /* Callback function */
      void *,                                    /* 1st argument to callback */
      char **errmsg                              /* Error msg written here */
    );

    参数:sqlite3 *指向打开的数据库

    参数:sql就是我们要执行的sql语句,要执行的sql语句都放在字符串里面,解析成sql语句进行执行

    参数:callback回调函数,分析一下这个回调函数,

    参数:void*,就是我们要传递给回调函数的参数,对应回调函数第一个参数。

    参数 :errmsg,保存错误信息。先声明一个指针char * myerrmsg,把&myerrmsg传递给errmsg,当sqlite3_exec出错时,会调用sqlite3_malloc()函数分配空间存放错误描述,直接printf("zErrMsg = %s \n", zErrMsg)得到一串字符串信息,这串信息告诉你错在什么地方。在使用完errmsg后,需要调用sqlite3_free()释放空间。

    参数:callback,回调函数,看一下回调函数

    int sqlite_callback(
        void* pv,    /* 由 sqlite3_exec() 的第四个参数传递而来 */
        int argc,        /* 表的列数 */
        char** argv,    /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */
        char** col        /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */
    );

    回调函数用来显示查询结果,对每一条查询结果,调用一次回调函数。后面三个参数都是系统自动传递的,

    argv指针数组,存储查询到的一行结果,根据前面的参数argc确定表的列数,就可以把一行结果存储在指针数组中了。

    col:用来存储表头字段,方法同argv。

    不需要使用回调函数的时候,sqlite3_exec参数3,4直接设置为NULL即可。

    回调函数使用:

    表内容如下:

    int mycallfunction(void *pv,int argc,char **argv,char** col)
    {
    	for(int i=0;i<argc;i++)
    	{
    		printf("%s\t%s\n", col[i],argv[i]);
    	}
    	return 0;//这里得有返回值,不然得报错
    }
    
    char *sql="select *from Student";
    ret=sqlite3_exec(db,sql,mycallfunction,NULL,&errmsg);

    4.增删查改操作

    只需把对应的sql语句传递给sqlite3_exec即可。

    har *sql1="INSERT INTO 'Student_Table' VALUES(1,'HUANGYANG',25);";
    ret=sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg);

    5.查询数据,使用sqlite3_get_table(过时的函数)

    SQLITE_API int sqlite3_get_table(
      sqlite3 *db,          /* An open database */
      const char *zSql,     /* SQL to be evaluated */
      char ***pazResult,    /* Results of the query */
      int *pnRow,           /* Number of result rows written here */
      int *pnColumn,        /* Number of result columns written here */
      char **pzErrmsg       /* Error msg written here */
    );

    char ***pazResult,pazResult指向一块查询结果表。尺寸为(pnColumn+1)*pnRow,因为它把表的标题那一行也算进来了

    pnRow:表的列数;pnColumn:查询结果行数

    char **pzErrmsg:保存错误信息

    char *sql="select *from Student";
    sqlite3_get_table(db,sql,&azResult,&nrow,&ncolumn,&azErrMsg);
    printf("row=%d,column=%d\n",nrow,ncolumn);
    for(int i=0;i<(nrow+1)*ncolumn;i++)
    {
         printf("azResult[%d]=%s\n",i,azResult[i]);
    }
    sqlite3_free_table(azResult);
    

    需要使用sqlite3_free_table函数对azResult的内存进行释放,这里不能使用sqlite3_free。

    6.sql语言中存在变量问题时,使用sqlite3_mprintf函数。(格式化字符串输出函数)

    SQLITE_API char *sqlite3_mprintf(const char*,...);
    char* sql=sqlite3_mprintf("insert into Student values('%d','%s','%d')",4,"lc",27);
    sqlite3_exec(db,sql,NULL,NULL,&azErrMsg); 

    五、一个完整的例子

    转载自:https://blog.csdn.net/zouleideboke/article/details/73649886

    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite3.h"
    #define _DEBUG_
    int main(int argc, char**argv)
    {
         sqlite3 *db=NULL;
         int len;
         int i=0;
         int nrow=0;
         int ncolumn = 0;
         char *zErrMsg =NULL;
         char **azResult=NULL; //二维数组存放结果
         /* 打开数据库 */
         len = sqlite3_open("user",&db);
         if( len )
         {
            /*  fprintf函数格式化输出错误信息到指定的stderr文件流中  */
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));//sqlite3_errmsg(db)用以获得数据库打开错误码的英文描述。
            sqlite3_close(db);
            exit(1);
         }
         else printf("You have opened a sqlite3 database named user successfully!\n");
     
         /* 创建表 */
         char *sql = " CREATE TABLE SensorData(\
             ID INTEDER PRIMARY KEY,\
             SensorID INTEGER,\
             siteNum INTEGER,\
             Time VARCHAR(12),\
             SensorParameter REAL\
             );" ;
     
          sqlite3_exec(db,sql,NULL,NULL,&zErrMsg);
    #ifdef _DEBUG_
          printf("%s\n",zErrMsg);
          sqlite3_free(zErrMsg);
    #endif
          /*插入数据  */
          char*sql1 ="INSERT INTO 'SensorData'VALUES(NULL,1,2,201430506201,13.5);";
          sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg);
          char*sql2 ="INSERT INTO 'SensorData'VALUES(NULL,3,4,201530506302,14.5);";
          sqlite3_exec(db,sql2,NULL,NULL,&zErrMsg);
          char*sql3 ="INSERT INTO 'SensorData'VALUES(NULL,5,6,201630506413,18.6);";
          sqlite3_exec(db,sql3,NULL,NULL,&zErrMsg);
     
          /* 查询数据 */
          sql="select *from SensorData";
          sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
          printf("nrow=%d ncolumn=%d\n",nrow,ncolumn);
          printf("the result is:\n");
          for(i=0;i<(nrow+1)*ncolumn;i++)
            {
              printf("azResult[%d]=%s\n",i,azResult[i]);
            }
     
         /* 删除某个特定的数据 */
          sql="delete from SensorData where SensorID = 1 ;";
          sqlite3_exec( db , sql , NULL , NULL , &zErrMsg );
    #ifdef _DEBUG_
          printf("zErrMsg = %s \n", zErrMsg);
          sqlite3_free(zErrMsg);
    #endif
     
          /* 查询删除后的数据 */
          sql = "SELECT * FROM SensorData ";
          sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
          printf( "row:%d column=%d\n " , nrow , ncolumn );
          printf( "After deleting , the result is : \n" );
          for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
          {
                printf( "azResult[%d] = %s\n", i , azResult[i] );
          }
          sqlite3_free_table(azResult);
    #ifdef _DEBUG_
       printf("zErrMsg = %s \n", zErrMsg);
       sqlite3_free(zErrMsg);
    #endif
     
          sqlite3_close(db);
          return 0;
     
    }

     

    展开全文
  • sqlite expert 使用方法

    2015-08-18 09:15:34
    简单方便的使用 sqlite expert图形化使用工具
  • Android SQLite用法演示

    2013-06-18 19:38:24
    SQLite是Android内置的一个数据库,程序演示了其的用法。代码完整,注释清楚,是根据网上mars老师的教学视频写的
  • 后来采用一种方法,就是直接在ASP.NET里面利用引用入的DLL新建数据库就可以用了。 string datasource = “d:\\test.db”; //数据库文件的地址 System.Data.SQLite.SQLiteConnection.CreateFile(datasource);...
  • Android开发SQLite基本用法

    千次阅读 2018-05-30 22:32:04
    前言 Android 开发中数据存储本地几乎是避免不了的。在这过程中,打交道比较多的比如数据库,...下面介绍下SQLite使用方法,以及过程中遇到的问题。 基本用法 数据库创建 class DBOpenHelper(context: Conte...

    前言

    Android 开发中数据存储本地几乎是避免不了的。在这过程中,打交道比较多的比如数据库,Android中内置了一款轻量级的数据库SQLite,在android.database.sqlite 包下提供了丰富的操作SQLite的API。下面介绍下SQLite的使用方法,以及过程中遇到的问题。

    基本用法

    • 数据库创建
    class DBOpenHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
    
        /静态变量声明处*/
        companion object {
            /*数据库名字*/
            public var DB_NAME = "pl_sqilte.db3"
            /*数据库的版本号*/
            private var DB_VERSION = 1;
            /*表名字*/
            public var TABLE_NAME = "city"
            /*创建表语句*/
            private var CITY_TABLE_CREATE = "create table " + TABLE_NAME + " (_id integer primary key, name String, letter String);"
            /*删除表操作*/
            private var DROP_CITY_TABLE = "DROP TABLE IF EXISTS" + TABLE_NAME
    
        }
    
        /**
         *  @funtion:onCreate()创建表
         *  @param:db  执行创建语句
         */
        override fun onCreate(db: SQLiteDatabase?) {
            db!!.execSQL(CITY_TABLE_CREATE)
        }
    
        /**
         *  @funtion:onUpgrade()更新表
         *  @param:执行更新语句
         */
        override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
            db!!.execSQL(DROP_CITY_TABLE)
        }
    }

    首先创建一个类继承SQLiteOpenHelper,这个类是个抽象类用来管理数据库的创建以及版本管理。主要是onCreate(创建) onUpgrade(更新)方法。创建此类实例即可创建一个新的数据库pl_sqlite.db3以及一张city表。

    Android Studio   Device File Explorer

    我们还可以通过 adb命令来看新建的数据库是否存在。前提,你的adb已经在环境变量已经做了配置。

    > adb shell
    > ls                            //会有一个data文件夹
    > cd  data                      //进入data文件夹下
    > ls                            //查看data目录下文件
    > 此时会报错 opendir failed, Permission denied
    > run-as com.ypl.meetingshare(你的包名)
    > ls                            //查看包下的文件 此时会有一个databases文件夹
    > cd databases                  //此时就会看到上图创建好的两个数据库文件
    • 数据库操作类

    数据库和表建好以后,接下来就是对表进行数据的增,删,改,查操作。

     /*操作类,静态构造,单例模式*/
    class DBOrderDao private constructor() {
    
        private var dbOpenHelper: DBOpenHelper? = null
        private var result: String = "这是一个空的数据表"
        private var db: SQLiteDatabase? = null
    
        /*静态变量与方法存放处*/
        companion object {
    
            private var dbOrderDao: DBOrderDao? = null
            /**
             *  @fuction: 获取操作类实例
             *  @params:null
             */
            fun getDaoInstance(): DBOrderDao {
                if (dbOrderDao == null) {
                    dbOrderDao = DBOrderDao()
                }
                return dbOrderDao!!
            }
        }
    
        /**
         *  @fuction: 向表中插入值
         *  @params:null
         */
        fun insertAllCity() {
            db = dbOpenHelper!!.writableDatabase
            db!!.beginTransaction()
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (1, '上海', 'S')")
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (2, '北京', 'B')")
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (3, '广州', 'G')")
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (4, '安徽', 'A')")
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (5, '滁州', 'C')")
            db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (6, '明光', 'M')")
    
            db!!.setTransactionSuccessful()
            db!!.endTransaction()
        }
    
        /**
         *  @fuction: 查询数据列表
         *  @params:null
         */
        fun queryAllDatas(): String {
            db = dbOpenHelper!!.writableDatabase
            val cursor = db!!.query(DBOpenHelper.TABLE_NAME, null, null, null, null, null, "_id asc") as Cursor
            val nameIndex = cursor.getColumnIndex("name")
            val id= cursor.getColumnIndex("_id")
            cursor.moveToFirst()
            while (!cursor.isAfterLast) {
                result = result + cursor.getString(nameIndex) + "\t\t"
                result = result + cursor.getInt(id) + " \n"
                cursor.moveToNext()
            }
            /*游标记得关闭,防止内存泄漏*/
            cursor.close()
            return result
        }
    
        /*类似java静态代码块*/
        init {
            dbOpenHelper = DBOpenHelper(PenglaiApplication.getSingleInstance())
        }
    
    }

    数据库操作类,单例实现,在使用时直接调用方法即可

    DBOrderDao.getDaoInstance().insertAllCity()
    
    (findViewById(R.id.textView) as TextView).text = DBOrderDao.getDaoInstance().queryAllDatas()
    

    并发访问数据库报错
    在调用操作类的过程中,遇到了一个问题,android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)。原因是我创建了两个操作类的实例去操作同一个数据库,并发访问数据库,数据库为了保持数据的安全性将数据进行锁死。所以只需要创建一个操作类实例即可避免这个问题的发生。

    数据的插入与查询

    结尾

    本篇文章介绍了在重构项目中关于Android内置数据库SQLite使用遇到的一些问题。在接下来的项目中将会深入相关方面知识。遇到的问题会在这里进行补充。

    展开全文
  • SQLITE用法

    2014-11-27 17:10:40
    sqlite3建立数据库的方法很简单,只要在shell下键入(以下$符号为shell提示号,请勿键入): $ sqlite3 foo.db如果目录下没有foo.db,sqlite3就会建立这个数据库。sqlite3并没有强制数据库档名要怎么取,
  • SQLite数据库是android系统内嵌的数据库,小巧强大,能够满足大多数SQL语句的处理工作,而SQLite数据库仅仅是个文件而已。...一些基本的用法: static SQLiteDatabase openDatabase(String path,SQLiteDatabase
  • android SQLite用法

    2015-07-06 10:52:59
    Richard Hipp 发布,它支持SQL语言,并且只用很少的内存就有很好的性能,它可以减少应用程序管理数据的开销,SQLite可移植性好、很容易使用、很小、高效而且可靠。此外它还是开源的,任何人都可以使用它。许多开源...
  • Sqlite使用简单教程

    千次阅读 2018-12-03 17:07:12
    SQLite简介 SQLite是遵守ACID的关联式数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。 不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中...
  • 本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程...
  • Android中SQLite用法

    2019-07-31 15:34:59
    Richard Hipp 发布,它支持SQL语言,并且只用很少的内存就有很好的性能,它可以减少应用程序管理数据的开销,SQLite可移植性好、很容易使用、很小、高效而且可靠。此外它还是开源的,任何人都可以使用它。许多开源...
  • 本篇文章主要介绍了iOS 原生sqlite3的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Android SQLite基本用法(极简)

    千次阅读 2020-10-31 10:30:46
    前言 SQLite是一个进程内的库,...为什么要使用SQLite 不需要一个单独的服务器进程或操作的系统(无服务器的)。 SQLite 不需要配置,这意味着不需要安装或管理。 一个完整的 SQLite 数据库是存储在一个单一的跨
  • 更新版的 HTML5+API 的sqlite使用方法

    千次阅读 2019-12-05 14:34:48
    **第一步:**先勾选模块权限配置,再点开源码视图会发现有一个SQLite 第二步:(直接附上代码吧,备注很详细) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name=...
  • 如果SQLite数据库加密,我这里使用的一个管理工具叫SQLiteDeveloper,如下就可以加密数据库 , 如果在工具中不提供密码的情况下打开数据库,会给你错误提示如下: , 或者在C# 使用错误的密码也会给你错误提示: ...
  • SQLite使用方法

    千次阅读 2018-03-21 11:09:49
    什么是 SQLite 1.SQLite数据库存储是 Android系统提供下的数据存储方式之一 2.SQLite是专为嵌入式设备设计的一款轻量级的数据库 3.SQLite占用资源非常低,在嵌入式设备中,只需要几百k的内存 4.SQLite支持标准的...
  • Sqlite全面学习(一)

    万次阅读 多人点赞 2015-05-08 10:27:16
    SQLite是一款轻型的数据库,是关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中。目前在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows...
  • 自己编写 能够完美实现 mars老师 android 01_16_SQLite使用方法 源码
  • 前言  SQLite是一种轻量级的小型... Android中使用SQLite数据库时,需要用adb来辅助调试,如果想在windows下的cmd命令行中使用adb,必须先配置环境变量,我这里是配的用户环境变量path: C:\Program Files\android-sd
  •  1 建立数据库档案  2 在sqlite3 提示列下操作  3 SQL 的指令格式  4 建立资料表  5 建立索引  6 加入一笔资料  7 查询资料  8 如何更改或删除资料  9 其他sqlite 的特别用法  10 小结

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,006
精华内容 44,802
关键字:

sqlite用法