将数据保存到sqlite数据库?

时间:2015-08-03 22:11:52

标签: android sqlite

这是我的主要活动,我在MainActivity方法的第29行insertData()中遇到异常,MyDatabaseAdapter()类包含schema.Can你能帮我解决我收到错误的地方吗?

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    Button button;

   MyDatabaseAdapter myDatabaseAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText=(EditText)findViewById(R.id.editText);
        button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name=editText.getText().toString();
                long id=myDatabaseAdapter.insertData(name);
                if(id<0)
                {
                    Toast.makeText(MainActivity.this,"Unsuccessful",Toast.LENGTH_LONG);
                }
                else
                {
                    Toast.makeText(MainActivity.this,"Successfull",Toast.LENGTH_LONG).show();
                }

            }
        });
    }


}

这是我的sqlite助手类

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;



public class MyDatabaseAdapter  {

    MyDatabase myDatabase;
    MyDatabaseAdapter(Context context)
    {
        myDatabase=new MyDatabase(context);
    }
    public long insertData(String name)
    {
        SQLiteDatabase sqLiteDatabase=myDatabase.getWritableDatabase();
        ContentValues contentValues=new ContentValues();
        contentValues.put(MyDatabase.NAME,name);
        long id=sqLiteDatabase.insert(myDatabase.TABLE_NAME,null,contentValues);
        return id;
    }

   static class MyDatabase extends SQLiteOpenHelper
   {
       private static final String DATABASE_NAME="Mydatabase";
       private static final int DATABASE_VERSION=3;
       private static final String TABLE_NAME="MyContacts";
       private static final String NAME="Name";
       // private static final String ADDRESS="Address";
       private static final String UID="_id";
       private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+NAME+" VARCHAR(255),;";
       private static final String DROP_TABLE="DROP TABLE IF EXISTS" +TABLE_NAME;

       public MyDatabase(Context context) {
           super(context, DATABASE_NAME, null, DATABASE_VERSION);
           Toast.makeText(context,"Constructor is called",Toast.LENGTH_LONG).show();
       }

       @Override
       public void onCreate(SQLiteDatabase db) {
           db.execSQL(CREATE_TABLE);
       }

       @Override
       public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
           db.execSQL(DROP_TABLE);
           onCreate(db);
       }
   }
}

3 个答案:

答案 0 :(得分:1)

您没有实例化MyDatabaseAdapter类。试试

myDatabaseAdapter = new MyDatabaseAdapter(this) after setContentView().

答案 1 :(得分:1)

首先,您应该能够为我们提供更多信息。您的logcat输出应该准确显示错误是什么,或者与调试器一起运行以捕获异常。无论如何,使用提供的信息,至少有一个问题是你的create语句有无效的语法。它评估为:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255),;

不需要逗号和分号,也没有右括号。它应该是:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255))

或更正确:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT)

...因为SQLite中没有VARCHAR类型。类型亲和力将您的VARCHAR(255)转换为TEXT,因为它包含字符串&#39; CHAR&#39;但最好只指定SQLite类型以确保达到预期效果。

答案 2 :(得分:0)

对不起,如果我说错了话,我还在学习。

但在第29行,考虑到你有2行代表包和一个休息,这就是这一行:

不应该长期用于数字吗?

        long id=myDatabaseAdapter.insertData(name);
  

&#34; long:长数据类型是64位二进制补码整数。该   signed long的最小值为-263,最大值为263-1。   在Java SE 8及更高版本中,您可以使用长数据类型来表示   无符号64位长,最小值为0,最大值为0   值为264-1。需要一系列值时,请使用此数据类型   比int提供的更广泛。 Long类还包含方法   比如compareUnsigned,divideUnsigned等支持算术   无符号长的操作。&#34;