一。不带参数的sql语句
从前天开始数据库sqlite语句 就无法实现添加数据:
1.Dbhelper类
package com.example.ceshi;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class Dbhelper extends SQLiteOpenHelper{
String sql="create table if not exists User"+"(id integer PRIMARY KEY AUTOINCREMENT,name char(50),content char(50))";
public Dbhelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
arg0.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
2.MainActivity类
public class MainActivity extends Activity {
private Button btn;
Dbhelper dbhelper = null;
SQLiteDatabase sqlite = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
dbhelper = new Dbhelper(MainActivity.this, "ceshi", null, 1);
sqlite = dbhelper.getWritableDatabase();
InsertDb();
sqlite.close();
}
});
}
public void InsertDb() {
String sql = "insert into User values(null," + "测试数据" + "," + "测试数据111"
+ ")";
try {
sqlite.execSQL(sql);
} catch (SQLException e) {
Log.i("err", "insert failed");
}
}
3.发生错误的结果
LogCat:
SQlite Develop显示数据库创建成功,但是没有录入数据:
4.将Dbhelper中的sql改成
String sql = "insert into User values(null," + 111 + "," + 111
+ ")";
结果Sqlite Develop显示录入数据
为什么String型数据录不进去,就只有int型录入成功呢?
5.调试
修改Dbhelper中的sql:
String sql = "insert into User (name,content) values ('测试数据name','测试数据content')";
结果显示录入成功:
6.总结:
这种简单的添加数据,录入不成功一般是sql语句写的不规范
二。带参数的sqlite语句(感谢http://blog.csdn.net/zhufuing/article/details/10120143)
1.错误提示:
SQLiteLog (1) no such Column:name
public void InsertDb(String name, String content) {
sqlite=dbHelper.getWritableDatabase();
String sql = "insert into User(name,content) values( "+name+","+content+")";
2.分析:InsertDb方法这里有两个形参name,content,
数据库中也有name,content这两个字段,错误提示是找不到name列。。。
3.解决方法:
后来发现我的name,content数据类型为Text,所以改成
public void InsertDb(String name, String content) {
sqlite=dbHelper.getWritableDatabase();
String sql = "insert into User(name,content) values( '"+name+"','"+content+"')";
除此之外引用网上的知识:
1。严格地说,SQLite 没有数据类型。SQLite 使用动态数据类型,即:数据的类型取决于数据本身,而不是它的容器(字段)
2。存储类型(Storage Class):数据保存到文件后的表现形式。包括:
- NULL - 空值
- INTERGER - 有符号整数类型
- REAL - 浮点数类型
- TEXT - 字符串(其编码取决于DB的编码)
- BLOB - 二进制表示
3。亲和类型(Type Affinity):数据表的列中的数据对Storage Class的倾向性
- TEXT
- NUMERIC
- INTEGER
- REAL
- NONE
由于SQLite采用的是动态数据类型,而其他传统的关系型数据库使用的是静态数据类型,即字段可以存储的数据类型是在表声明时即以确定的,因此它们之间在数据存储方面还是存在着很大的差异。在SQLite中,存储分类和数据类型也有一定的差别,如INTEGER存储类别可以包含6种不同长度的Integer数据类型,然而这些INTEGER数据一旦被读入到内存后,SQLite会将其全部视为占用8个字节无符号整型。因此对于SQLite而言,即使在表声明中明确了字段类型,我们仍然可以在该字段中存储其它类型的数据。然而需要特别说明的是,尽管SQLite为我们提供了这种方便,但是一旦考虑到数据库平台的可移植性问题,我们在实际的开发中还是应该尽可能的保证数据类型的存储和声明的一致性。除非你有极为充分的理由,同时又不再考虑数据库平台的移植问题,在此种情况下确实可以使用SQLite提供的此种特征。