Sqlite语法

id字段自增

sql="CREATE TABLE IF NOT EXISTS MusicList (id integer primary key AutoIncrement,name varchar(20),path varchar(20))";

 

  

<br>常用Select语句

复制代码
desc <table> //查看表结构 
select * from <table> //查询所有更
select , from table ;//查看指定列
select distinct , from table ;//非重复查询
insert into users(_id,username,password) select * from users;//复制
select username from users where username like 'S%' ;//非重名字首字母为大写S的用户
select username from users where username like '__S%' ;//非重名字第三个字母为大写S的用户
select * from users where _id in(001,220,230);
select * from user order by _id;//以id的顺序排列
select * from user order by _id desc;//以id反的顺序排
复制代码

 

分页

当数据库数据量很大时,分页显示是个很简单且符合人们习惯的一种处理方法。

获取数据行总数:

 

最简单的方法是:SELECT所有的行,再调用curosr.getCount() ;取得行数,但这样效率会很低。 SQLite为我们提供了一个函数很容易查出总共有多少行。有个名为cet6_table的表格,我们想知道总共有多少行的word;可以使用如下 语句来完成:
SELECT count(word) AS number FROM cet6_table;

 

count()函数为我们返回一个Int整形,代表有多少行数据。返回的列的名字叫count(word),为了方便阅读和处理用as number给这个列取个 别名number;

SELECT [word],[explanation] FROM cet6_table ORDER BY word LIMIT 100 OFFSET 200"

 

 

上语句,返回自第200行的最多100条数据。分页时我们只要修改offset 后面的数据即可取得对应页面的数据。  

SQLite内建语法表

结构定义
CREATE TABLE

创建新表。

语法:

sql-command ::= CREATE [TEMP | TEMPORARY] TABLE table-name (
    
column-def [, column-def]*
    [, constraint]*
)
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
type ::= typename |
typename ( number ) |
typename ( number , number )
column-constraint ::= NOT NULL [ conflict-clause ] |
PRIMARY KEY [sort-order] [ conflict-clause ] |
UNIQUE [ conflict-clause ] |
CHECK ( expr ) [ conflict-clause ] |
DEFAULT value |
COLLATE collation-name
constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |
UNIQUE ( column-list ) [ conflict-clause ] |
CHECK ( expr ) [ conflict-clause ]
conflict-clause ::= ON CONFLICT conflict-algorithm
CREATE VIEW

创建一个视图(虚拟表),该表以另一种方式表示一个或多个表中的数据。

语法:

sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [database-name.] view-name AS select-statement

例子:
CREATE VIEW master_view AS
    SELECT * FROM sqlite_master WHERE type='view';
说明:
创建一个名为master_view的视图,其中包括sqlite_master这个表中的所有视图表。

CREATE TRIGGER

创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。

语法:

sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ]
database-event ON [database-name .] table-name
trigger-action
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name INSTEAD OF
database-event ON [database-name .] view-name
trigger-action
database-event ::= DELETE | 
INSERT 
| 
UPDATE 
| 
UPDATE OF 
column-list
trigger-action ::= [ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN expression ] 
BEGIN 
    
trigger-step ; [ trigger-step ; ]*
END
trigger-step ::= update-statement | insert-statement | 
delete-statement | select-statement

例子:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers 
  BEGIN
    UPDATE orders SET address = new.address WHERE customer_name = old.name;
  END;
说明:
创建了一个名为update_customer_address的触发器,当用户更新customers表中的address字段时,将触发并更新orders表中的address字段为新的值。
比如执行如下一条语句:
UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';
数据库将自动执行如下语句:
UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';

CREATE INDEX

为给定表或视图创建索引。

语法:

sql-statement ::= CREATE [UNIQUE] INDEX index-name 
ON 
[database-name .] table-name ( column-name [, column-name]* )
[ ON CONFLICT conflict-algorithm ]
column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]

例子:
CREATE INDEX idx_email ON customers (email);
说明:
为customers表中的email创建一个名为idx_email的字段。

结构删除
DROP TABLE

删除表定义及该表的所有索引。

语法:

sql-command ::= DROP TABLE [database-name.] table-name

例子:
DROP TABLE customers;

DROP VIEW

删除一个视图。

语法:

sql-command ::= DROP VIEW view-name

例子:
DROP VIEW master_view;

DROP TRIGGER

删除一个触发器。

语法:

sql-statement ::= DROP TRIGGER [database-name .] trigger-name

例子:
DROP TRIGGER update_customer_address;

DROP INDEX

删除一个索引。

语法:

sql-command ::= DROP INDEX [database-name .] index-name

例子:
DROP INDEX idx_email;

数据操作
INSERT

将新行插入到表。

语法:

sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)]VALUES(value-list) |
INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement
UPDATE

更新表中的现有数据。

语法:

sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name
SET assignment [, assignment]*
[WHERE expr]
assignment ::= column-name = expr
DELETE

从表中删除行。

语法:

sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]
SELECT

从表中检索数据。

语法:

sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]
result ::= result-column [, result-column]*
result-column ::= * | table-name . * | expr [ [AS] string ]
table-list ::= table [join-op table join-args]*
table ::= table-name [AS alias] |
( select ) [AS alias]
join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]
sort-expr-list ::= expr [sort-order] [, expr [sort-order]]*
sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]
compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT
REPLACE

类似INSERT

语法:

sql-statement ::= REPLACE INTO [database-name .] table-name [( column-list )] VALUES ( value-list ) |
REPLACE INTO [database-name .] table-name [( column-list )] select-statement
事务处理
BEGIN TRANSACTION

标记一个事务的起始点。

语法:

sql-statement ::= BEGIN [TRANSACTION [name]]
END TRANSACTION

标记一个事务的终止。

语法:

sql-statement ::= END [TRANSACTION [name]]
COMMIT TRANSACTION

标志一个事务的结束。

语法:

sql-statement ::= COMMIT [TRANSACTION [name]]
ROLLBACK TRANSACTION

将事务回滚到事务的起点。

语法:

sql-statement ::= ROLLBACK [TRANSACTION [name]]
其他操作
COPY

主要用于导入大量的数据。

语法:

sql-statement ::= COPY [ OR conflict-algorithm ] [database-name .] table-name FROM filename
[ USING DELIMITERS delim ]

例子:
COPY customers FROM customers.csv;

EXPLAIN

语法:

sql-statement ::= EXPLAIN sql-statement
PRAGMA

语法:

sql-statement ::= PRAGMA name [value] |
PRAGMA function(arg)
VACUUM

语法:

sql-statement ::= VACUUM [index-or-table-name]
ATTACH DATABASE

附加一个数据库到当前的数据库连接。

语法:

sql-statement ::= ATTACH [DATABASE] database-filename AS database-name
DETTACH DATABASE

从当前的数据库分离一个使用ATTACH DATABASE附加的数据库。

语法:

sql-command ::= DETACH [DATABASE] database-name

SQLite内建函数表

算术函数
abs(X) 返回给定数字表达式的绝对值。
max(X,Y[,…]) 返回表达式的最大值。
min(X,Y[,…]) 返回表达式的最小值。
random(*) 返回随机数。
round(X[,Y]) 返回数字表达式并四舍五入为指定的长度或精度。
字符处理函数
length(X) 返回给定字符串表达式的字符个数。
lower(X) 将大写字符数据转换为小写字符数据后返回字符表达式。
upper(X) 返回将小写字符数据转换为大写的字符表达式。
substr(X,Y,Z) 返回表达式的一部分。
randstr()  
quote(A)  
like(A,B) 确定给定的字符串是否与指定的模式匹配。
glob(A,B)  
条件判断函数
coalesce(X,Y[,…])  
ifnull(X,Y)  
nullif(X,Y)  
集合函数
avg(X) 返回组中值的平均值。
count(X) 返回组中项目的数量。
max(X) 返回组中值的最大值。
min(X) 返回组中值的最小值。
sum(X) 返回表达式中所有值的和。
其他函数
typeof(X) 返回数据的类型。
last_insert_rowid() 返回最后插入的数据的ID。
sqlite_version(*) 返回SQLite的版本。
change_count() 返回受上一语句影响的行数。
last_statement_change_count()  
 
 

java 的base64处理类


/***************************************************************

	Copyright (c) 1998, 1999 Nate Sammons <nate@protomatter.com>  
	This library is free software; you can redistribute it and/or
	modify it under the terms of the GNU Library General Public
	License as published by the Free Software Foundation; either
	version 2 of the License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Library General Public License for more details.

	You should have received a copy of the GNU Library General Public
	License along with this library; if not, write to the
	Free Software Foundation, Inc., 59 Temple Place - Suite 330,
	Boston, MA  02111-1307, USA.

	Contact support@protomatter.com with your questions, comments,
	gripes, praise, etc...

	***************************************************************/


	/***************************************************************
	  - moved to the net.matuschek.util tree by Daniel Matuschek
	  - replaced deprecated getBytes() method in method decode
	  - added String encode(String) method to encode a String to 
	    base64
	 ***************************************************************/

	/**
	 * Base64 encoder/decoder.  Does not stream, so be careful with
	 * using large amounts of data
	 *
	 * @author Nate Sammons
	 * @author Daniel Matuschek
	 * @version Id: Base64.java,v 1.4 2001/04/17 10:09:27 matuschd Exp
	 */
	public class HiBase64
	{

	  private HiBase64()
	  {
	    super();
	  }

	  /**
	   *  Encode some data and return a String.
	   */
	  public final static String encode(byte[] d)
	  {
	    if (d == null) return null;
	    byte data[] = new byte[d.length+2];
	    System.arraycopy(d, 0, data, 0, d.length);
	    byte dest[] = new byte[(data.length/3)*4];

	    // 3-byte to 4-byte conversion
	    for (int sidx = 0, didx=0; sidx < d.length; sidx += 3, didx += 4)
	    {
	      dest[didx]   = (byte) ((data[sidx] >>> 2) & 077);
	      dest[didx+1] = (byte) ((data[sidx+1] >>> 4) & 017 |
	                  (data[sidx] << 4) & 077);
	      dest[didx+2] = (byte) ((data[sidx+2] >>> 6) & 003 |
	                  (data[sidx+1] << 2) & 077);
	      dest[didx+3] = (byte) (data[sidx+2] & 077);
	    }

	    // 0-63 to ascii printable conversion
	    for (int idx = 0; idx <dest.length; idx++)
	    {
	      if (dest[idx] < 26)     dest[idx] = (byte)(dest[idx] + 'A');
	      else if (dest[idx] < 52)  dest[idx] = (byte)(dest[idx] + 'a' - 26);
	      else if (dest[idx] < 62)  dest[idx] = (byte)(dest[idx] + '0' - 52);
	      else if (dest[idx] < 63)  dest[idx] = (byte)'+';
	      else            dest[idx] = (byte)'/';
	    }

	    // add padding
	    for (int idx = dest.length-1; idx > (d.length*4)/3; idx--)
	    {
	      dest[idx] = (byte)'=';
	    }
	    return new String(dest);
	  }

	  /**
	   * Encode a String using Base64 using the default platform encoding
	   **/
	  public final static String encode(String s) {
	    return encode(s.getBytes());
	  }

	  /**
	   *  Decode data and return bytes.
	   */
	  public final static byte[] decode(String str)
	  {
	    if (str == null)  return  null;
	    byte data[] = str.getBytes();
	    return decode(data);
	  }

	  /**
	   *  Decode data and return bytes.  Assumes that the data passed
	   *  in is ASCII text.
	   */
	  public final static byte[] decode(byte[] data)
	  {
	    int tail = data.length;
	    while (data[tail-1] == '=')  tail--;
	    byte dest[] = new byte[tail - data.length/4];

	    // ascii printable to 0-63 conversion
	    for (int idx = 0; idx <data.length; idx++)
	    {
	      if (data[idx] == '=')    data[idx] = 0;
	      else if (data[idx] == '/') data[idx] = 63;
	      else if (data[idx] == '+') data[idx] = 62;
	      else if (data[idx] >= '0'  &&  data[idx] <= '9')
	        data[idx] = (byte)(data[idx] - ('0' - 52));
	      else if (data[idx] >= 'a'  &&  data[idx] <= 'z')
	        data[idx] = (byte)(data[idx] - ('a' - 26));
	      else if (data[idx] >= 'A'  &&  data[idx] <= 'Z')
	        data[idx] = (byte)(data[idx] - 'A');
	    }

	    // 4-byte to 3-byte conversion
	    int sidx, didx;
	    for (sidx = 0, didx=0; didx < dest.length-2; sidx += 4, didx += 3)
	    {
	      dest[didx]   = (byte) ( ((data[sidx] << 2) & 255) |
	              ((data[sidx+1] >>> 4) & 3) );
	      dest[didx+1] = (byte) ( ((data[sidx+1] << 4) & 255) |
	              ((data[sidx+2] >>> 2) & 017) );
	      dest[didx+2] = (byte) ( ((data[sidx+2] << 6) & 255) |
	              (data[sidx+3] & 077) );
	    }
	    if (didx < dest.length)
	    {
	      dest[didx]   = (byte) ( ((data[sidx] << 2) & 255) |
	              ((data[sidx+1] >>> 4) & 3) );
	    }
	    if (++didx < dest.length)
	    {
	      dest[didx]   = (byte) ( ((data[sidx+1] << 4) & 255) |
	              ((data[sidx+2] >>> 2) & 017) );
	    }
	    return dest;
	  }

	  /**
	   *  A simple test that encodes and decodes the first commandline argument.
	   */
	  public static final void main(String[] args)
	  {
	    if (args.length != 1)
	    {
	      System.out.println("Usage: Base64 string");
	      System.exit(0);
	    }
	    try
	    {
	      String e = HiBase64.encode(args[0].getBytes());
	      String d = new String(HiBase64.decode(e));
	      System.out.println("Input   = '" + args[0] + "'");
	      System.out.println("Encoded = '" + e + "'");
	      System.out.println("Decoded = '" + d + "'");
	    }
	    catch (Exception x)
	    {
	      x.printStackTrace();
	    }
	  }
	}

Moto android 双卡 发送短消息

Moto 双卡 指定卡发送短消息

phoneType =1 为GSM卡 0为CDMA卡

XT788实测可用.

	public String sendMSG(String phone, String msg,int phoneType) 
	{
		String Exp_string = "";
		try {
			Class smsManagerClass = null;
			Class[] divideMessagePamas = { String.class };
			Class[] sendMultipartTextMessagePamas = { String.class,
					String.class, ArrayList.class, ArrayList.class,
					ArrayList.class, int.class };
			Method divideMessage = null;
			Method sendMultipartTextMessage = null;
			smsManagerClass = Class.forName("android.telephony.MSimSmsManager");
			Method method = smsManagerClass.getMethod("getDefault",
					new Class[] {});
			Object smsManager = method.invoke(smsManagerClass, new Object[] {});
			divideMessage = smsManagerClass.getMethod("divideMessage",
					divideMessagePamas);
			sendMultipartTextMessage = smsManagerClass.getMethod(
					"sendMultipartTextMessage", sendMultipartTextMessagePamas);
			ArrayList magArray = (ArrayList) divideMessage
					.invoke(smsManager, msg);
			sendMultipartTextMessage.invoke(smsManager, phone, "", magArray,
					null, null, phoneType);
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "IllegalArgumentException";
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "IllegalAccessException";
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "InvocationTargetException";
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "ClassNotFoundException";
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "SecurityException";
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "NoSuchMethodException";
		}
		return Exp_string;
	}

列举API

	public String checkapi(Context context) {
		String Exp_string = "";
		try {
			Class pkgClass = null;
			pkgClass = Class.forName("android.telephony.MSimSmsManager");
			Method[] methods = pkgClass.getMethods();
			for (Method m : methods) {
				// if (m.getName().contains(str))
				{
					Exp_string = Exp_string + m.toGenericString() + "\n\n";
				}
			}

		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "IllegalArgumentException";
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "ClassNotFoundException";
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
			Exp_string = "SecurityException";
		}
		return Exp_string;
	}

原作:飞雪

MyEclipse 10 安装 Android 开发 环境 记录

一、安装 JDK

下载JDK最新版本,下载地址如下:

http://www.oracle.com/technetwork/java/javase/downloads/index.html

这里我下载的是: Java SE Development Kit 6u24 for Windows x64, Multi-language,即这个文件:jdk-6u24-windows-x64.exe

下载后安装。Windows 下安装完毕后需要设置三个环境变量

JAVA_HOME
指明JDK安装路径,就是刚才安装时的路径C:\Program Files\Java\jdk1.7.0_17,此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse,ant 等都需要使用此变量)

PATH
Path使得系统可以在任何路径下识别java命令,设为:%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin

CLASSPATH
CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别,设为:
.;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar

(要加.表示当前路径)
%JAVA_HOME%就是引用前面指定的JAVA_HOME。

二:下载 Android SDK

下载Android SDK
http://developer.android.com/sdk/index.html#download

下载后解压备用

三:安装MyEclipse(并破解)
实测10通过 ,版本9安装ADT时会出错!

四:设置 ADT

下载新的 ADT

MyEclipse的Help->MyEclipse Configuration Center->Software->add site
弹出如下对话框,填入ADT的地址:
Name: ADT
URL: https://dl-ssl.google.com/android/eclipse/
或者使用下载的ADT zip
下载ADT地址
http://developer.android.com/sdk/installing/installing-adt.html
https://dl.google.com/android/ADT-21.1.0.zip

选择 OK 后 在 Personal Sites 栏中就可以看到ADT了,双击要安装的插件
在 Software Updates Available 中就可以看到待安装的插件了
在Pending Changes栏中选择 Apply

其后按提示"同意",漫长的等待后安装完成.

五:重启MyEclipse,会提示选择 android SDK 位置,选择之前下载的 android SDK位置即可