注意事项
- 首先手机没root是不能直接看数据库文件的,只能通过查询显示到界面上,仿真可以
- 数据库不需要先人工创建,直接执行语句,没有数据库的话会自动创建
- 布局文件在res文件夹下layout.xml文件夹下,每个xml布局文件都是一个界面,通过setContentView(R.layout.布局文件名)调用布局
- 每个Activity都需要在AndroidManifest.xml注册是为了匹配intent请求
- @string/变量名,可以应用在value.xml文件中定义的字符串,其他属性同理
- 调试程序时不要打开酷狗音乐,与adb冲突
- 创建表时会自动生成android_metadata表,用来登记用户的使用语言:zh_cn
- 当一张表包含了用 “AUTOINCREMENT” 修饰的列时, sqlite 将自动创建表 “SQLITE_SEQUENCE”
表SQLITE_SEQUENCE中只有两个字段: name, seq 。
入门使用
Sqlite数据库,查询语句用标准的SQL语法就可以,INSERT,UPDATA等
public class className1 extends SQLiteOpenHelper{//必须继承SQLiteOpenHelper类
private static final int VERSION = 1;//这个是版本,1,2,3等
private static final String FLAG="className";//这个是Log的标签,直接用类名
public className1(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
public className1(Context context,String name){
this(context,name,VERSION);
}
public className1(Context context,String name,int version){
this(context, name,null,version);
}
//以上三个构造函数固定的不用改
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table test(id int,name varchar(20))";//创建一个表,SQL语句可以自己定制
db.execSQL(sql);//执行Sql语句的格式
Log.i(FLAG,"创建数据库成功,自动生成表成功!");//Log打印信息
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//这个不用管
Log.i(FLAG,"更新数据库成功!");<span style="font-family: Arial, Helvetica, sans-serif;">//Log打印信息</span>
}
把上面的单独作为一个类(三个固定的构造函数,一个创建表,一个不用管)你需要做的就是改动OnCreate里的SQL建表语句
在一个新的类里写上
new className1(this,"databaseName");
这样一个名为databaseName的带有test表的数据库就建好了
注意onCreate里的建表语句只有第一次创建数据库时才会执行,以后想要建新表可以用SQL语句
数据库只两种类型的语句
1,执行,2,查询
className1 object = new className1(this,"databaseName");//例化一个object对象//每次要用到执行或者查询都写一次//databaseName写你要操作的数据库名
Cursor cursor = object.getReadableDatabase().rawQuery("SQL查询语句");//查询语句就是SELECT
getReadableDatabase().execSQL("SQL执行语句");//执行语句就是建表,INSERT,UPDATA等
也就是说如果你想建新表,更新字段,插入等操作你一共需要写两句话 查询会查出数据,也是写两句话,但是查询出的数据还需要处理,要多几句话,下面说查出来的数据怎么处理 主要就是对cursor处理
private static final String FLAG="className";//这个是Log的标签,直接用类名
while(cursor.moveToNext())
{
Log.i(FLAG,cursor.getString(0)); //getString里面是每条记录的字段索引,可以根据字段数目更换值
}
读取数据一共需要一个while和一句话
常用查询语句
- 如果表不存在则创建
"create table if not exists user (ID integer primary key autoincrement not null,name varchar(20))"
- 插入语句
"insert into user(name) values('name')"
while(cursor.moveToNext()),遍历Cursor时getString()索引从0开始
查询语句字段名不用加’ ’
cursor.moveToFirst();实际上是移动到了第二行,遍历时可以用do while
插入字符串时用.toString().trim()去空格
- 查询表信息
SELECT
col.colorder AS 序号 ,
col.name AS 列名 ,
ISNULL(ep.[value], '') AS 列说明 ,
t.name AS 数据类型 ,
col.length AS 长度 ,
ISNULL(COLUMNPROPERTY(col.id, col.name, 'Scale'), 0) AS 小数位数 ,
CASE WHEN COLUMNPROPERTY(col.id, col.name, 'IsIdentity') = 1 THEN '√'
ELSE ''
END AS 标识 ,
CASE WHEN EXISTS ( SELECT 1
FROM dbo.sysindexes si
INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id
AND si.indid = sik.indid
INNER JOIN dbo.syscolumns sc ON sc.id = sik.id
AND sc.colid = sik.colid
INNER JOIN dbo.sysobjects so ON so.name = si.name
AND so.xtype = 'PK'
WHERE sc.id = col.id
AND sc.colid = col.colid ) THEN '√'
ELSE ''
END AS 主键 ,
CASE WHEN col.isnullable = 1 THEN '√'
ELSE ''
END AS 允许空
FROM dbo.syscolumns col
LEFT JOIN dbo.systypes t ON col.xtype = t.xusertype
inner JOIN dbo.sysobjects obj ON col.id = obj.id
AND obj.xtype = 'U'
AND obj.status >= 0
LEFT JOIN dbo.syscomments comm ON col.cdefault = comm.id
LEFT JOIN sys.extended_properties ep ON col.id = ep.major_id
AND col.colid = ep.minor_id
AND ep.name = 'MS_Description'
LEFT JOIN sys.extended_properties epTwo ON obj.id = epTwo.major_id
AND epTwo.minor_id = 0
AND epTwo.name = 'MS_Description'
WHERE obj.name = 'three_output'--表名
ORDER BY col.colorder ;