Android SQLite3命令详解教程

SQLite3可以让我们手动的对SQLite数据库进行管理。一共有2个sqlite3,一个在电脑上,它位于 android-sdk-windows\tools\sqlite3.exe,用于电脑上SQLite数据库进行管理;还有一个位于Android系统上(手机上),它用于位于Android系统上的SQLite数据库进行管理,对于后者你需要通过adb shell进入shell。有时我们不想直接在Android系统上对SQLite数据库进行操作,这时可以把它拷贝到电脑上进行操作。

但是需要注意前者是Windows系统,后者是Linux系统,他们表示路径的方式不一样。

在SQLite3命令后可跟一个参数指定要打开或创建的数据库文件。如果指定的数据库文件还不存在,就会新建一个数据库,且以该参数作为文件名。对于Android系统上的SQLite3,必须通过其shell来运行,如果新建数据库的话,需要root权限,可以在shell中键入"su"来获得root权限。

如果是Android系统的sqlite3程序(通过shell运行),你可以Ctrl键+D ,然后回车退出该程序回到shell,也可以Ctrl键+C直接退出Shell,如果是电脑上的SQLite3,可以Ctrl键+C直接退出SQLite3程序。

下面就是一个创建包含一个名叫"tbl1"的表的名叫"ex1"的SQLite数据库的示例。

示例1:

java代码:

 
  1. $sqlite3ex1
  2. SQLiteversion3.3.10
  3. Enter".help"forinstructions
  4. sqlite>createtabletbl1(onevarchar(10),twosmallint);
  5. sqlite>insertintotbl1values('hello!',10);
  6. sqlite>insertintotbl1values('goodbye',20);
  7. sqlite>select*fromtbl1;
  8. hello!|10
  9. goodbye|20
  10. sqlite>

SQLite3支持两种命令,一种是SQL命令,一种是非SQL命令,非SQL命令以"."作为前缀,比如".tables"命令。

可以通过".help"命令来查看它所有的非SQL命令.所有不以"."为前缀的语句,都将做SQL进行解释,当时对于SQL语句你需要在末尾加上分号";"以表示SQL语句输入完成,这时你输入的命令才开始按照SQL语言进行执行。

示例2:

java代码:

 
  1. sqlite>CREATETABLEtbl2(
  2. ...>f1varchar(30)primarykey,
  3. ...>f2text,
  4. ...>f3real
  5. ...>);
  6. sqlite>

关于数据库的schema是存放在一个叫sqlite_master的表中,你虽然不能对它进行DROP TABLE, UPDATE, INSERT or DELETE操作,但是可以像普通的表一样对它进行查询。

示例3:

java代码:

 
  1. sqlite3/data/data/com.android.providers.settings/databases/settings.db
  2. SQLiteversion3.6.22
  3. Enter".help"forinstructions
  4. EnterSQLstatementsterminatedwitha";"
  5. sqlite>.tables
  6. .tables
  7. android_metadatabookmarkssystem
  8. bluetooth_devicessecure
  9. sqlite>select*fromsqlite_master;
  10. select*fromsqlite_master;
  11. table|android_metadata|android_metadata|3|CREATETABLEandroid_metadata(localeTEXT)
  12. table|system|system|4|CREATETABLEsystem(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONCONFLICTREPLACE,valueTEXT)
  13. index|sqlite_autoindex_system_1|system|5|
  14. table|sqlite_sequence|sqlite_sequence|6|CREATETABLEsqlite_sequence(name,seq)
  15. index|systemIndex1|system|7|CREATEINDEXsystemIndex1ONsystem(name)
  16. table|secure|secure|8|CREATETABLEsecure(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONCONFLICTREPLACE,valueTEXT)
  17. index|sqlite_autoindex_secure_1|secure|9|
  18. index|secureIndex1|secure|10|CREATEINDEXsecureIndex1ONsecure(name)
  19. table|bluetooth_devices|bluetooth_devices|11|CREATETABLEbluetooth_devices(_idINTEGERPRIMARYKEY,nameTEXT,addrTEXT,channelINTEGER,typeINTEGER)
  20. table|bookmarks|bookmarks|12|CREATETABLEbookmarks(_idINTEGERPRIMARYKEY,tit
  21. leTEXT,folderTEXT,intentTEXT,shortcutINTEGER,orderingINTEGER)
  22. index|bookmarksIndex1|bookmarks|13|CREATEINDEXbookmarksIndex1ONbookmarks(folder)
  23. index|bookmarksIndex2|bookmarks|14|CREATEINDEXbookmarksIndex2ONbookmarks(shortcut)
  24. sqlite>
  25. 在sqlite3中我们可以通过".help"命令来查所有的非SQL命令。

    sqlite3 8种不同的方式显示查询返回的结果:"csv", "column", "html", "insert", "line", "list","tabs", "tcl".

    你可以通过.mode来设置显示的方式。默认的是"list"方式,这时返回结果的一条记录显示一行,每列的内容之间用设定的分隔符隔开,

    默认的分隔符是"|".

    示例5:

    java代码:

     
      
    1. sqlite>.modelist
    2. sqlite>select*fromtbl1;
    3. hello|10
    4. goodbye|20
    5. sqlite>

    你可以通过".separator"来设置"list"模式下的分隔符。比如我们想把", "作为分隔符,可以这样:

    示例6:

    java代码:

     
      
    1. sqlite>.separator","
    2. sqlite>select*fromtbl1;
    3. hello,10
    4. goodbye,20
    5. sqlite>

    "line"模式下, 每行只显示数据库的一行的一列。每行由列名,等号和列的值组成。每条记录之间由一个空行隔开。

    示例7

    java代码:

     
      
    1. sqlite>.modeline
    2. sqlite>select*fromtbl1;
    3. one=hello
    4. two=10
    5. one=goodbye
    6. two=20
    7. sqlite>

    "column"模式下,每条记录都在单独一行显示。第一行显示的是列名,第二行只是用于分割列名和记录的数据,第三行开始才是记录的内容。

    示例8:

    java代码:

     
      
    1. sqlite>.modecolumnsqlite>select*fromtbl1;
    2. onetwo
    3. --------------------
    4. hello10
    5. goodbye20
    6. sqlite>

    默认情况下,每列的宽度最多只能显示10个字符。所以如果数据包含的字符如果他太多,可能就显示不完。

    但是我们可以通过".width"设置每列的宽度。

    示例9:

    java代码:

     
      
    1. sqlite>.width126
    2. sqlite>select*fromtbl1;
    3. onetwo
    4. ------------------
    5. hello10
    6. goodbye20
    7. sqlite>

    示例9就把第1列和第二列的宽度分别设置为了12和6个字符,其他列的宽度并没改变。

    如果你把列宽设置为0,那么调整为以下三个的最大值:10,该列的列名字符数,第一行记录该列的字符数。这样列的宽度就可以自动调整。

    默认的列宽就是0,以便它可以自动调整。

    可以通过".header"命令可以设置是否显示头(头包括第一行,列名,第二行,分隔行)。

    示例10:

    java代码:

     
      
    1. sqlite>.headeroff
    2. sqlite>select*fromtbl1;
    3. hello10
    4. goodbye20
    5. sqlite>

    "insert"模式下,返回的查询结果将以SQL的INSERT语句形式进行显示。

    示例11:

    java代码:

     
      
    1. sqlite>.modeinsertnew_table
    2. sqlite>select*fromtbl1;
    3. INSERTINTO'new_table'VALUES('hello',10);
    4. INSERTINTO'new_table'VALUES('goodbye',20);
    5. sqlite>

    "html"模式下,查询返回结果将以XHTML table的形式进行显示,它并不以<TABLE>作为开头和</TABLE>作为结尾。 但是每条记录以<TR>作为开始,</TR>作为结束,记录的数据以<TD>作为开始,以</TD>作为结束

    示例12:

    java代码:

     
      
    1. sqlite>select*fromsystem;
    2. select*fromsystem;
    3. <TR><TD>1</TD>
    4. <TD>volume_music</TD>
    5. <TD>7</TD>
    6. </TR>
    7. <TR><TD>4</TD>
    8. <TD>volume_voice</TD>
    9. <TD>4</TD>
    10. </TR>
    11. sqlite>

    ".output"命令可以把查询返回结果的输出定向到文件上。该命令的第一个参数即是要定向的位置。在把输出定向了文件后,可以通过".output stdout"把输出重新定向到标准输出上。

    示例13:

    java代码:

     
      
    1. sqlite>.modelist
    2. sqlite>.separator|
    3. sqlite>.outputtest_file_1.txt
    4. sqlite>select*fromtbl1;
    5. sqlite>.exit
    6. $cattest_file_1.txt
    7. hello|10
    8. goodbye|20
    9. $

  26. sqlite3提供了多个命令来查看数据库的schema".tables"命令可以查看当前数据库所有的表

    示例14:

    java代码:

     
      
    1. sqlite>.tables
    2. tbl1
    3. tbl2
    4. sqlite>

    ".tables"和在list模式下执行下面的语句相似:

    SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1

    实际上, 如果你查看sqlite3程序的源码 (found in the source tree in the file src/shell.c), you'll find exactly the above query.

    另外,".tables"命令后也可以跟一参数,它是一个pattern,这样命令就只列出表名和该参数匹配的表。

    示例14-1:

    java代码:

     
      
    1. sqlite>.tables
    2. .tables
    3. android_metadatabookmarkssystem
    4. bluetooth_devicessecure
    5. sqlite>.tabless%
    6. .tabless%
    7. securesqlite_sequencesystem
    8. sqlite>

    ".indices"命令列出指定表的所有indices(索引)。第一个参数为表的名字。

    示例15:

    java代码:

     
      
    1. sqlite>.schemasystem
    2. .schemasystem
    3. CREATETABLEsystem(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
    4. ONFLICTREPLACE,valueTEXT);
    5. CREATEINDEXsystemIndex1ONsystem(name);
    6. sqlite>.tables
    7. .tables
    8. android_metadatabookmarkssystem
    9. bluetooth_devicessecure
    10. sqlite>.indicessystem
    11. .indicessystem
    12. sqlite_autoindex_system_1
    13. systemIndex1
    14. sqlite>

    ".schema"命令,在没有参数的情况,它会显示最初用于创建数据库的CREATE TABLE和CREATE INDEX的SQL语句。比如,示例16

    ".schema"命令可以包含一个参数,它是一个pattern,用于对表进行过滤,这时只会显示满足条件的表和所有索引的SQL语句。

    比如,示例15和示例17.

    示例16:

    java代码:

     
      
    1. sqlite>.schema
    2. .schema
    3. CREATETABLEandroid_metadata(localeTEXT);
    4. CREATETABLEbluetooth_devices(_idINTEGERPRIMARYKEY,nameTEXT,addrTEXT,chan
    5. nelINTEGER,typeINTEGER);
    6. CREATETABLEbookmarks(_idINTEGERPRIMARYKEY,titleTEXT,folderTEXT,intentTE
    7. XT,shortcutINTEGER,orderingINTEGER);
    8. CREATETABLEsecure(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
    9. ONFLICTREPLACE,valueTEXT);
    10. CREATETABLEsystem(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
    11. ONFLICTREPLACE,valueTEXT);
    12. CREATEINDEXbookmarksIndex1ONbookmarks(folder);
    13. CREATEINDEXbookmarksIndex2ONbookmarks(shortcut);
    14. CREATEINDEXsecureIndex1ONsecure(name);
    15. CREATEINDEXsystemIndex1ONsystem(name);
    16. sqlite>

    示例17:

    java代码:

     
      
    1. sqlite>.schemas%
    2. .schemas%
    3. CREATETABLEsecure(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
    4. ONFLICTREPLACE,valueTEXT);
    5. CREATETABLEsqlite_sequence(name,seq);
    6. CREATETABLEsystem(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameTEXTUNIQUEONC
    7. ONFLICTREPLACE,valueTEXT);
    8. CREATEINDEXsecureIndex1ONsecure(name);
    9. CREATEINDEXsystemIndex1ONsystem(name);
    10. sqlite>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值