[英]Not able to insert values for SQLIte in android
我正在使用一個簡單的演示程序,正在創建數據庫,然后創建一個表並嘗試向該表中添加值
我能做什么 ::我可以在sqlite中創建表
我無法執行的操作 ::我無法在其中插入值
MainActivity.java
public class MainActivity extends Activity{
Button addUser;
SqliteAdapter helper;
EditText usrName,pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper=new SqliteAdapter(this);
addUser=(Button) findViewById(R.id.button1);
usrName=(EditText) findViewById(R.id.editText1);
pwd=(EditText)findViewById(R.id.editText2);
}
public void addUser(View view){
Log.d("LOG-MSG", "Onclick detected");
helper.insertData(usrName.getText().toString(), pwd.getText().toString());
}
}
SqliteAdapter.java
public class SqliteAdapter{
SqliteHelper helper;
ContentValues cv;
SQLiteDatabase db;
public SqliteAdapter(Context context){
helper=new SqliteHelper(context);
}
public void insertData(String name,String password){
db=helper.getWritableDatabase();
Log.d("LOG-MSG", "insertDataMethod Entry");
try {
cv.put(SqliteHelper.NAME, name);
Log.d("LOG-MSG", "Name inserted");
cv.put(SqliteHelper.PASSWORD, password);
Log.d("LOG-MSG", "password inserted");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-EXCEPTION", e.toString());
}
db.insert(SqliteHelper.TABLE_NAME, null, cv);
}
static class SqliteHelper extends SQLiteOpenHelper{
private Context context;
private static final String DATABASE_NAME="MyDatabase";
private final static String TABLE_NAME="MyTable";
private static final int DATABASE_VERSION=1;
private final static String ID="_id";
private final static String NAME="name";
private final static String PASSWORD="password";
private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(225), "+PASSWORD+" VARCHAR(225));";
private static final String DROP_TABLE="DROP TABLE IF EXISTS "+TABLE_NAME+"";
public SqliteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context=context;
Log.d("LOG-MSG", "Constructor Called");
Message.message(context, "Constructor Called");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("LOG-MSG", "OnCreate Called");
Message.message(context, "OnCreate Called");
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-onCreate", e.toString());
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL(DROP_TABLE);
} catch (SQLException e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-onUpgrade", e.toString());
Message.message(context, "onUpgrade Called");
}
onCreate(db);
}
}
}
日志 ::
04-18 13:45:19.567: D/LOG-MSG(3371): Constructor Called
04-18 13:45:20.007: D/gralloc_goldfish(3371): Emulator without GPU emulation detected.
04-18 13:45:20.107: W/TextLayoutCache(3371): computeValuesWithHarfbuzz -- need to force to single run
04-18 13:46:22.747: D/LOG-MSG(3371): Onclick detected
04-18 13:46:22.809: D/LOG-MSG(3371): insertDataMethod Entry
04-18 13:46:22.809: D/LOG-MSG-EXCEPTION(3371): java.lang.NullPointerException
04-18 13:46:22.817: I/SqliteDatabaseCpp(3371): sqlite returned: error code = 1, msg = near "null": syntax error, db=/data/data/com.example.sqlitedatabasedemo/databases/MyDatabase
MainActivity.java
public class MainActivity extends Activity{
Button addUser;
SqliteAdapter helper;
EditText usrName,pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper=new SqliteAdapter(this);
addUser=(Button) findViewById(R.id.button1);
usrName=(EditText) findViewById(R.id.editText1);
pwd=(EditText)findViewById(R.id.editText2);
}
public void addUser(View view){
Log.d("LOG-MSG", "Onclick detected");
long recievedValue=helper.insertData(usrName.getText().toString(), pwd.getText().toString());
if(recievedValue<0){
Log.d("LOG-MSG", "NotInserted");
}else
{
Log.d("LOG-MSG", "Inserted");
}
}
}
SqliteAdapter.java
public class SqliteAdapter{
SqliteHelper helper;
ContentValues cv;
SQLiteDatabase db;
public SqliteAdapter(Context context){
helper=new SqliteHelper(context);
}
public long insertData(String name,String password){
db=helper.getWritableDatabase();
Log.d("LOG-MSG", "insertDataMethod Entry");
cv=new ContentValues();
cv.put(SqliteHelper.NAME, name);
Log.d("LOG-MSG", "Name="+name+"inserted");
cv.put(SqliteHelper.PASSWORD, password);
Log.d("LOG-MSG", "password="+password+"inserted");
long result=db.insert(SqliteHelper.TABLE_NAME, null, cv);
return result;
}
static class SqliteHelper extends SQLiteOpenHelper{
private Context context;
private static final String DATABASE_NAME="MyDatabase";
private final static String TABLE_NAME="MyTable";
private static final int DATABASE_VERSION=1;
private final static String ID="_id";
private final static String NAME="name";
private final static String PASSWORD="password";
private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(225), "+PASSWORD+" VARCHAR(225));";
private static final String DROP_TABLE="DROP TABLE IF EXISTS "+TABLE_NAME+"";
public SqliteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context=context;
Log.d("LOG-MSG", "Constructor Called");
Message.message(context, "Constructor Called");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("LOG-MSG", "OnCreate Called");
Message.message(context, "OnCreate Called");
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
onCreate(db);
}
}
}
日志 ::
04-18 14:21:59.937: D/LOG-MSG(13661): Onclick detected
04-18 14:22:00.337: D/LOG-MSG(13661): insertDataMethod Entry
04-18 14:22:00.337: D/LOG-MSG(13661): Name=usainserted
04-18 14:22:00.337: D/LOG-MSG(13661): password=obamainserted
04-18 14:22:00.377: D/LOG-MSG(13661): Inserted
問題:當我檢查DDMS .... i時,可以看到數據庫。 當我在查詢瀏覽器中看到它時,沒有插入任何值....為什么會發生...我也嘗試調試可能的日志語句
您尚未初始化ContentValues cv
對象。 捕獲了一個NPE,然后嘗試插入具有null
ContentValues
引用的NPE,從而導致終止應用程序的異常。
將cv = new ContentValues()
添加到您的插入代碼中。
不要捕獲Exception
。 大多數情況下,它只是隱藏了您應解決的問題。
同樣,在onCreate()
和onUpgrade()
您不應捕獲SQLException
而應將其傳播到調用方。
看來您並沒有使ContentValues陷入困境。 嘗試做如下
public void insertData(String name,String password){
db=helper.getWritableDatabase();
Log.d("LOG-MSG", "insertDataMethod Entry");
try {
cv = new ContentValues ();
cv.put(SqliteHelper.NAME, name);
Log.d("LOG-MSG", "Name inserted");
cv.put(SqliteHelper.PASSWORD, password);
Log.d("LOG-MSG", "password inserted");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-EXCEPTION", e.toString());
}
db.insert(SqliteHelper.TABLE_NAME, null, cv);
}
您好,您有一個問題,ContentValues cv沒有正確實例化。
請添加cv = new ContentValues ();
使用以下代碼
public class SqliteAdapter{
SqliteHelper helper;
ContentValues cv;
SQLiteDatabase db;
public SqliteAdapter(Context context){
helper=new SqliteHelper(context);
}
public void insertData(String name,String password){
db=helper.getWritableDatabase();
cv = new ContentValues ();
Log.d("LOG-MSG", "insertDataMethod Entry");
try {
cv.put(SqliteHelper.NAME, name);
Log.d("LOG-MSG", "Name inserted");
cv.put(SqliteHelper.PASSWORD, password);
Log.d("LOG-MSG", "password inserted");
} catch (Exception e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-EXCEPTION", e.toString());
}
db.insert(SqliteHelper.TABLE_NAME, null, cv);
}
static class SqliteHelper extends SQLiteOpenHelper{
private Context context;
private static final String DATABASE_NAME="MyDatabase";
private final static String TABLE_NAME="MyTable";
private static final int DATABASE_VERSION=1;
private final static String ID="_id";
private final static String NAME="name";
private final static String PASSWORD="password";
private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(225), "+PASSWORD+" VARCHAR(225));";
private static final String DROP_TABLE="DROP TABLE IF EXISTS "+TABLE_NAME+"";
public SqliteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context=context;
Log.d("LOG-MSG", "Constructor Called");
Message.message(context, "Constructor Called");
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("LOG-MSG", "OnCreate Called");
Message.message(context, "OnCreate Called");
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-onCreate", e.toString());
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL(DROP_TABLE);
} catch (SQLException e) {
// TODO Auto-generated catch block
Log.d("LOG-MSG-onUpgrade", e.toString());
Message.message(context, "onUpgrade Called");
}
onCreate(db);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.