问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

安卓需要存一些参数信息、测量数据和计算结果,File和SQlite哪个好?_百度...

发布网友 发布时间:2022-04-30 01:31

我来回答

2个回答

懂视网 时间:2022-04-30 15:19

游标对象主要包含以下方法:

  • execute(): 执行sql语句
  • executemany(): 执行多条sql语句
  • close(): 关闭游标
  • fetchone(): 从结果中取一条记录
  • fetchmany(): 从结果中取多条记录
  • fetchall(): 从结果中取出所有记录
  • 注:为了提高编程效率,PySqlite中的Connection对象同样包含execute()等函数,通过使用这些函数,可以避免创建游标对象,具体可以参考PySqlite的文档说明:点击这里,下面的例子来自前面的文档,介绍如何使用这些方法:

    import sqlite3
    
    persons = [
     ("Hugo", "Boss"),
     ("Calvin", "Klein")
     ]
    
    con = sqlite3.connect(":memory:")
    
    # Create the table
    con.execute("create table person(firstname, lastname)")
    
    # Fill the table (这里使用PySqlite提供的占用符格式,提高安全性)
    con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
    
    # Print the table contents (使用迭代的方法获取查询结果)
    # con.execute(..)方法返回游标对象,避免手动创建游标对象。
    for row in con.execute("select firstname, lastname from person"):
     print row
    
    print "I just deleted", con.execute("delete from person").rowcount, "rows"

    4. 通过execute()方法执行一条sql语句

    SQLite中sql语句在语法格式,参考这里。

    例如使用create table创建数据库表格:

    cur.execute(‘‘‘create table stocks (
    date text,
    trans text,
    symbol text,
    qty real,
    price real)‘‘‘)

    表格创建之后,可以使用insert语句插入数据:

    cur.execute("""insert into stocks values (‘2006-01-05‘,‘BUY‘,‘RHAT‘,100,35.14)""")

    5. 提交事务

    conn.commit()

    6. 关闭游标及数据库链接,释放资源

    cur.close()
    conn.close()

    PySqlite其它操作

    在执行插入语句的时候,经常需要使用脚本中定义的变量,PySqlite中提供了多种形式的占位符,可以方便进行变量替换,提高安全性。

    例如,回到之前插入的步骤:

    cur.execute("""insert into stocks values (‘2006-01-05‘,‘BUY‘,‘RHAT‘,100,35.14)""")

    在这里,使用的是字符串sql语句的形式,如果我们需要更改一些数据,就不得不重新写一次,这样一来可重用性就大大降低了。因此,Python提供 了一种机制,可以使用Python中的变量来代替sql字符串语句中的特定占位符。而对具体的语法,可以通过查询DB模块的paramstyle参数来访 问,以下是几种类型的语法说明:

    ‘qmark‘: Question mark style, 
      e.g. ‘...WHERE name=?‘
    ‘numeric‘: Numeric, positional style, 
      e.g. ‘...WHERE name=:1‘
    ‘named‘: Named style, 
      e.g. ‘...WHERE name=:name‘
    ‘format‘: ANSI C printf format codes, 
      e.g. ‘...WHERE name=%s‘
    ‘pyformat‘: Python extended format codes, 
      e.g. ‘...WHERE name=%(name)s‘
    

    关于如何使用,可以参考这篇博客python 数据库查询参数风格。当然Python自带的文档中也有讲如何使用,也可以参考它。

    目前PySqlite支持qmark和named两种形式。例如使用qmark形式,并且以元组(tuple)的形式作为第二个参数传递给execute函数:

    t = (‘2006-01-05‘,‘BUY‘,‘RHAT‘,100,35.14)
    cur.execute("insert into stocks values(?,?,?,?,?)", t)

    当需要更多的数据的时候,这种方法就方便多了:

    for t in [(‘2006-03-28‘, ‘BUY‘, ‘IBM‘, 1000, 45.00), (‘2006-04-05‘, ‘BUY‘, ‘MSOFT‘, 1000, 72.00), (‘2006-04-06‘, ‘SELL‘, ‘IBM‘, 500, 53.00)]:
     cur.execute(‘insert into stocks values (?,?,?,?,?)‘, t)

    或者也可以使用executemany()方法来实现,该方法的第二个参数是一个序列或者迭代器,然后根据第一个参数指定的sql语句依次替换执行。上面的插入例子可以写成:

    param_seq = [
     (‘2006-03-28‘, ‘BUY‘, ‘IBM‘, 1000, 45.00), 
     (‘2006-04-05‘, ‘BUY‘, ‘MSOFT‘, 1000, 72.00), 
     (‘2006-04-06‘, ‘SELL‘, ‘IBM‘, 500, 53.00)
    ]
    
    cur.executemany(‘insert into stocks values (?,?,?,?,?)‘, param_seq)

    那么还有一种需求是,一次性执行多条sql语句,就好比在mysql的一些图形化界面中输入多条sql语句,然后点击执行,在PySqlite中可以通过executescript()方法来完成这个任务,例如(例子来源于官方文档):

    cur.executescript("""
     create table person(
     firstname,
     lastname,
     age
     );
    
     create table book(
     title,
     author,
     published
     );
    
     insert into book(title, author, published)
     values (
     ‘Dirk Gently‘‘s Holistic Detective Agency‘,
     ‘Douglas Adams‘,
     1987
     );
     """)

    SQLite笔记

    1. 如何确定数据库中是否存在某个表
    在SQLite中存在一张特殊的表SQLITE_MASTER,它是只读的,该表的定义语句如下所示:

    CREATE TABLE sqlite_master (
     type TEXT,
     name TEXT,
     tbl_name TEXT,
     rootpage INTEGER,
     sql TEXT
    );

    其中,对于Table来说,type值为"table",而name为数据库的表名称。那么查询数据库中所有的表,可以使用下面的方法:

    SELECT name FROM sqlite_master
    WHERE type=‘table‘
    ORDER BY name;

    相应的如果,要查找是否存在表stocks可以这样做:

    SELECT count(*) FROM sqlite_master where name=‘stocks‘ and type=‘table‘;

    返回1则代表存在,0则表示不存在。

    参考:http://sqlite.org/faq.html#q7

    转:pysqlite笔记

    标签:

    热心网友 时间:2022-04-30 12:27

    使用SQLite方式存储数据

      在Android中一共提供了5种数据存储方式,分别为:

      (1)Files:通过FileInputStream和FileOutputStream对文件进行操作。具体使用方法可以参阅博文《Android学习笔记34:使用文件存储数据》。

      (2)Shared Preferences:常用来存储键值对形式的数据,对系统配置信息进行保存。具体使用方法可以参阅博文《Android学习笔记35:使用Shared Preferences方式存储数据》。

      (3)Content Providers:数据共享,用于应用程序之间数据的访问。

      (4)SQLite:Android自带的轻量级关系型数据库,支持SQL语言,用来存储大量的数据,并且能够对数据进行使用、更新、维护等操作。

      (5)Network:通过网络来存储和获取数据。

      本篇博文介绍第四种方式,通过Android自带的SQLite数据库存储数据。

    1.SQLite简介

      SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。

      SQLite和C/S模式的数据库软件不同,它是一款嵌入式数据库,没有独立运行的进程,与所服务的应用程序在应用程序进程空间内共生共存。它的代码与应用程序代码也是在一起的,或者说嵌入其中,作为托管它的程序的一部分。因此不存在数据库的客户端和服务器,使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。

      数据库服务器在程序中的好处是不需要网络配置或管理。将数据库客户端与服务器运行在同一个进程中,可以省去不少的操作及麻烦:不用担心防火墙或者地址解析;不用浪费时间管理复杂的授权和权限;可以减少网络调用相关的消耗;可以简化数据库管理并使程序更容易部署。

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

      此外,SQLite数据库中的所有信息(比如表、视图、触发器等)都包含在一个文件内,方便管理和维护。SQLite数据库还支持大部分操作系统,除电脑上使用的操作系统之外,很多手机上使用的操作系统同样可以运行。同时,SQLite数据库还提供了多语言的编程接口,供开发者使用。

    2.SQL基本命令

      SQL是与关系型数据库通信的唯一方式。它专注于信息处理,是为构建、读取、写入、排序、过滤、映射、分组、聚集和通常的管理信息而设计的声明式语言。

      在讲解SQL基本命令之前,有必要先了解一下SQLite所支持的数据类型都有哪些。

    2.1 SQLite支持的数据类型

      SQLite采用动态数据存储类型,会根据存入的值自动进行判断。SQLite支持以下5种数据类型:

      (1)NULL:空值

      (2)INTEGER:带符号的整型

      (3)REAL:浮点型

      (4)TEXT:字符串文本

      (5)BLOB:二进制对象

    2.2 SQL基本命令

      表是探索SQLite中SQL的起点,也是关系型数据库中信息的标准单位,所有的操作都是以表为中心的。那么如何使用SQL命令创建一张表呢?

    2.2.1创建表

      表是由行和列组成的,列称为字段,行称为记录。

      使用CREATE命令可以创建表,CREATE命令的一般格式为:

      CREATE [TEMP/TEMPORARY] TABLE table_name (column_definitions [, constraints]);

      其中,[]中的内容是可选的,用TEMP或TEMPORARY关键字声明的表是临时表,这种表只存活于当前会话,一旦连接断开,就会被自动销毁。如果没有明确指出创建的表是临时表,则创建的是基本表,将会在数据库中持久存在,这也是数据库中最常见的表。

      CREATE TABLE命令至少需要一个表名和一个字段名,上述命令中的table_name表示表名,表名必须与其他标识符不同。column_definitions由用逗号分隔的字段列表组成,每个字段定义包括一个名称、一个域(类型)和一个逗号分隔的字段约束。其中,域是指存储在该列的信息的类型,约束用来控制什么样的值可以存储在表中或特定的字段中。

      一条创建表的命令示例如下:

    1   CREATE TABLE tab_student (studentId INTEGER PRIMARY KEY AUTOINCREMENT,
    2   studentName VARCHAR(20),
    3   studentAge INTEGER);

      如上,我们创建了一个名为tab_student的表,该表包含3个字段:studentId、 studentName和studentAge,其数据类型分别为:INTEGER、VARCHAR和INTEGER。

      此外,通过使用关键字PRIMARY KEY,我们指定了字段studentId所在的列是主键。主键确保了每一行记录在某种方式上与表中的其他行记录是不同的(唯一的),进而确保了表中的所有字段都是可寻址的。

      SQLite为主键提供自增长功能,当定义字段类型为INTEGER PRIMARY KEY时,SQLite将为该字段创建默认值,该默认值确保整数值是唯一的。SQLite使用64-bit单符号整数主键,因此,该字段的最大值是9,223,372,036,854,775,807。当达到最大值时,SQLite会自动搜索该字段还未使用的值,并作为要插入的值。从表中删除记录时,rowid可能被回收并在后面的插入中使用。因此,新创建的rowid不一定是按照严格顺序增长的。如果想要SQLite使用唯一的自动主键值,而不是填补空白,可以在主键定义INTEGER PRIMARY KEY中加入关键字AUTOINCREMENT。AUTOINCREMENT关键字阻止rowid回收,它将为新插入的记录产生新的(不是回收的)rowid。

    2.2.2插入记录

      使用INSERT命令可以一次插入一条记录,INSERT命令的一般格式为:

      INSERT INTO tab_name (column_list) VALUES (value_list);

      其中,tab_name指明将数据插入到哪个表中,column_list是用逗号分隔的字段名称,这些字段必须是表中存在的,value_list是用逗号分隔的值列表,这些值是与column_list中的字段一一对应的。

      比如,向刚才创建的tab_student表中插入一条记录,便可以使用如下的语句完成:

      INSERT INTO tab_student (studentId, studentName, studentAge) VALUES (1, “jack”, 23);

      通过以上的语句,便插入了一条studentName=”jack”, studentAge=”23”的记录,该记录的主键为studentId=1。

    2.2.3更新记录

      使用UPDATE命令可以更新表中的记录,该命令可以修改一个表中一行或者多行中的一个或多个字段。UPDATE命令的一般格式为:

      UPDATE tab_name SET update_list WHERE predicate;

      其中,update_list是一个或多个字段赋值的列表,字段赋值的格式为column_name=value。WHERE子句使用断言识别要修改的行,然后将更新列应用到这些行。

      比如,要更新刚才插入到tab_student表中的记录,便可以使用如下的语句完成:

      UPDATE tab_student SET studentName=”tom”, studentAge=”25” WHERE studentId=1;

      通过以上的语句,便可以将刚才插入的主键为studentId=1的记录更新为studentName=”tom”, studentAge=”25”了。

    2.2.4删除记录

      使用DELETE命令可以删除表中的记录,DELETE命令的一般格式为:

      DELETE FROM table_name WHERE predicate;

      其中,table_name指明所要删除的记录位于哪个表中。和UPDATE命令一样,WHERE子句使用断言识别要删除的行。

      比如,要删除刚才插入的记录,便可以使用如下的语句完成:

      
      DELETE FROM tab_student WHERE studentId=1;

    2.2.5查询记录

      SELECT命令是查询数据库的唯一命令。SELECT命令也是SQL命令中最大、最复杂的命令。

      SELECT命令的通用形式如下:

      SELECT [distinct] heading

      FROM tables

      WHERE predicate

      GROUP BY columns

      HAVING predicate

      ORDER BY columns

      LIMIT count,offset;

      其中,每个关键字(如FROM、WHERE、HAVING等)都是一个单独的子句,每个子句由关键字和跟随的参数构成。GROUP BY和HAVING一起工作可以对GROUP BY进行约束。ORDER BY使记录集在返回之前按一个或多个字段的值进行排序,可以指定排序方式为ASC(默认的升序)或DESC(降序)。此外,还可以使用LIMIT限定结果集的大小和范围,count指定返回记录的最大数量,offset指定偏移的记录数。

      在上述的SELECT命令通用形式中,除了SELECT之外,所有的子句都是可选的。目前最常用的SELECT命令由三个子句组成:SELECT、FROM、WHERE,其基本语法形式如下:

      SELECT heading FROM tables WHERE predicate;

      比如,要查询刚才插入的记录,便可以使用如下的语句完成:

      
      SELECT studentId, studentName, studentAge FROM tab_student WHERE studentId=1;

      至此,我们介绍了SQL中最基本和最常用的CREATE、INSERT、UPDATE、DELETE和SELECT命令。当然了,这里只是对其进行了简单的介绍,有关SQLite中SQL命令的详细使用方法,可以参阅《SQLite权威指南》一书的第三章和第四章。

    3.数据库操作辅助类SQLiteOpenHelper

      Android提供了一个重要的类SQLiteOpenHelper,用于辅助用户对SQLite数据库进行操作。

      SQLiteOpenHelper的构造函数原型如下:

      public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version);

      其中,参数context表示应用程序运行的环境,包含应用程序所需的共享资源。参数name表示Android的数据库名字。参数factory是SQLiteDatabase.CursorFactory类对象,用于存储查询Android SQLite数据库的结果集。参数version表示应用程序所用的数据库的版本,该版本并非SQLite的真正版本,而是指定应用程序中的SQLite数据库的版本,当该版本号发生变化时,将会触发SQLiteOpenHelper类中的onUpgrade()或onDowngrade()方法。

      SQLiteOpenHelper类的所有方法如图1所示。

    图1 SQLiteOpenHelper类的方法

      其中,close()方法用于关闭SQLiteOpenHelper对象中的SQLite数据库;getReadableDatabase()方法和getWriteableDatabase()方法类似,getReadableDatabase()方法以只读状态打开SQLiteOpenHelper对象中指定的SQLite数据库,任何想要修改数据库的操作都是不允许的;getWriteableDatabase()方法也是打开数据库,但是允许数据库正常的读/写操作;在一个不存在的数据库上调用任何方法时,都会隐式的调用SQLiteOpenHelper对象的onCreate()方法;当应用程序第一次访问数据库时,则会调用onOpen()方法,但是,如果版本号发生了变化的话,则会调用onUpgrade()或onDowngrade()方法。

    4.数据库类SQLiteDatabase

      SQLiteDatabase类用来完成对数据库的操作任务,比如表的选择、插入、更新和删除语句等。

      SQLiteDatabase类中常用的用于执行SQL语句的方法有以下一些。

      (1)execSQL()方法:

      public void execSQL (String sql);

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

      (2)query()方法:

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

      public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
    groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal);

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

      public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String
    groupBy, String having, String orderBy, String limit);

      (3)queryWithFactory()方法:

      public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String
    orderBy, String limit,CancellationSignal cancellationSignal);

      public Cursor queryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, boolean distinct, String table, String[]columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);

      (4)rawQuery()方法:

      public Cursor rawQuery (String sql, String[] selectionArgs, CancellationSignal cancellationSignal);

      public Cursor rawQuery (String sql, String[] selectionArgs);

      (5)rawQueryWithFactory()方法:

      public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
    selectionArgs,String editTable);

      public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[]
    selectionArgs,String editTable, CancellationSignal cancellationSignal);

      其中,execSQL()方法都有一个参数sql,这个参数是一个SQL语句。第二个参数bindArgs接收一个数组,数组中的每个成员*了一个查询。execSQL()方法用于运行那些没有返回值的查询语句,比如创建、插入、更新和修改表。

      query()方法和queryWithFactory()方法是在数据库中运行一些轻量级的单查询语句,参数包括table、columns、groupBy、having、orderBy、limit等SQL语句关键字。这些方法允许将SQL语句传递给相关方法,而不必直接使用SQL语句。

      rawQuery()方法和rawQueryWithFactory()方法也都有一个参数sql,用于执行SQL查询语句,返回值是Cursor对象。这两个方法都有一个版本能够接收一个字符串数组selectionArgs作为参数,通过这个参数,SQLiteDatabase对象将把*的SQL语句中的问号(?)用这个数组中的值代替,并按照一一对应的位置关系进行取代。

      SQLiteDatabase类提供了大约50个方法,除此之外还有一些用于打开数据库的方法(如openDatabase()、openOrCreateDatabase()等),用于管理SQLite事务的方法(如beginTransaction()、endTransaction()等),用于测试数据库是否被锁住的方法(如isDbLockedByCurrentThread()、isDbLockedByOtherThread()等),以及获取数据库基本信息的方法(如getMaximumSiza()、getVersion()等)。这里就不一一介绍了,具体可以参阅SQLiteDatabase类的API帮助文档。

    5.游标类Cursor

      在Android中,查询数据是通过Cursor类来实现的,当我们使用SQLiteDatabase.query()或SQLiteDatabase.rawQuery()方法时,会得到一个Cursor对象,Cursor指向的就是每一条记录,它提供了很多有关查询的方法,如图2所示。
    http://www.cnblogs.com/menlsh/archive/2013/04/13/3019588.html
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    “晚来天欲雪,能饮一杯无?”是什么意思_出处及原文翻译_学习力 胸肌中部怎么练 血沉高是怎么回事,怎样才能降低啊! 中海锦江城多久交房 “QMS”作为“质量管理体系”的英文缩写,其背后理论及应用如何?_百度... 我用QQ登的快手绑定了一个电话号码,电话号码不用了,现在怎么能登得进去... 桂林银行白金客户条件 桂林银行最高等级卡 iQOO 11系列曝光,预计年底正式发布! vivo X90先别买?iQOO 11系列配置堪称豪华 在咸鱼上卖了个二手鱼缸,回去买家说漏水要求赔偿怎么办 安卓有类似Sql Server的软件吗?推荐几个。 卖二手鱼缸,只用了1年 如何重新安装打印机驱动? 如何重新安装打印机驱动? 石家庄哪有卖二手鱼缸的市场?急急急! 军人有任务可以先上车后补票坐火车吗? 2011年4月1日早上10点7分出生的女孩的生辰八字是什么求高人指点姓瞿的女孩名字 三日内加分 这1米5金龙牌鱼缸二手值多少钱 有人说张柏芝靠“好妈妈”人设洗白,对此你怎么看? 连云港哪里有卖二手鱼缸的? 姓瞿取什么名字好听要有三点水女孩 初夜后第二天.女友有少量血.是否需要去医院诊断? 我今个月生个女孩!想给她起个名.希望大家多献策一下.谢谢!小姓(瞿) 新婚初夜,什么也不会,怎么办? 瞿姓,女孩取名,2010年2月6日22点25分生,,哪位大师给起个名字!谢谢 哪里有二手鱼缸的 处理二手鱼缸9成新鱼缸 北京哪有专门卖二手鱼缸的地方? 请大家帮忙取个好听又有韵味不俗气的女孩的名字,一方姓瞿,一方姓刘4个字的。 有什么安卓软件有优化数据库功能的吗 重装系统后,如何添加打印机 Photoshop为什么不能保存pdf格式? 有什么运行在安卓系统上的数据库管理软件吗? 有没有一款安卓系统(手机上用)上用的本地数据库管理软件,类似Windows系统中的office access软件。 有没有能下载Android上运行的数据库管理工具,类似Navicat那样在Windows那样的功能 安卓软件的数据库怎么搭建?要用什么软件? android软件SQLite Editor是如何打开data/data中的数据库的呢 安卓应用程序数据库? 安卓编程数据库的应用 请问如何做一个安卓手机软件来listview一个sqlite数据库中的指定列啊? 与陌生人交谈作文 最好捡垃圾的人 杭州整形医院地址 电烤箱能放冰箱上吗? 冰箱上面可以放烤箱吗 用来买股票的资金有利息吗? 冰箱可不可以和烤箱放在一起 冰箱上放烤箱垫什么好 请问存在股票资金账户里的资金是否有利息?怎么算的? 天坑宝藏by天下霸唱的小说资源或在线观看链接