簡體   English   中英

無法在Android中插入SQLIte的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM