我是android领域的新手,并且遇到了在android应用中插入的问题?

时间:2019-11-28 15:13:13

标签: java android sqlite

我只是简单地做了一个插入形式,它将三个数字作为输入存储在数据库中(请注意,我正在使用sqlite数据库)。 因此,最主要的是,当我单击“提交”时,它将通过一个错误,指出没有这样的表:-messgae_table。 我试图找到我的代码有什么问题,但对我来说什么都没有解决! 请帮助我。......

Main Activity.java页面:-

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try{
                    DatabaseQueries db=new DatabaseQueries(Main2Activity.this);
                    Log.e("data",editText1.getText().toString());
                    long result=db.addMessageNumber(editText1.getText().toString(),editText2.getText().toString(),editText3.getText().toString());
                    if (result>0){
                        Toast.makeText(Main2Activity.this, "Inserted", Toast.LENGTH_SHORT).show();
                    }
                    else {
                        Toast.makeText(Main2Activity.this, "Not Inserted", Toast.LENGTH_SHORT).show();
                    }
                }
                catch (Exception e){
                    e.getMessage();
                    e.printStackTrace();

                }


DatabaseColumn.java:-

public static final String MESSAGE_TABLE = "message_table";
    public static final String MESSAGE_NUMBERONE = "message_numberone";
    public static final String MESSAGE_NUMBERTWO = "messgae_numbertwo";
    public static final String MESSAGE_NUMBERTHREE = "message_numberthree";

数据库创建:-

public class DatabaseCreation extends SQLiteOpenHelper {
    private static String DB_NAME = "secure.db";
    private static int DB_VERSION = 1;


    private String message_table = "CREATE TABLE " + DatabaseColumn.MESSAGE_TABLE + " ( " + DatabaseColumn.MESSAGE_NUMBERONE + " TEXT, " + DatabaseColumn.MESSAGE_NUMBERTWO + " TEXT, " + DatabaseColumn.MESSAGE_NUMBERTHREE + " TEXT )";

    public DatabaseCreation(Context context){

        super(context, DB_NAME,null,DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(contact_table);
        sqLiteDatabase.execSQL(message_table);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

数据库查询:-

public long addMessageNumber(String numberone, String numbertwo, String numberthree){
        SQLiteDatabase sqLiteDatabase2=db.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(DatabaseColumn.MESSAGE_NUMBERONE,numberone);
        cv.put(DatabaseColumn.MESSAGE_NUMBERTWO,numbertwo);
        cv.put(DatabaseColumn.MESSAGE_NUMBERTHREE,numberthree);
        long result=sqLiteDatabase2.insert(DatabaseColumn.MESSAGE_TABLE,null,cv);
        sqLiteDatabase2.close();
        return result;
    }

1 个答案:

答案 0 :(得分:0)

您的代码(除sqLiteDatabase.execSQL(contact_table);行外,在组合在一起时似乎可以正常工作。

  • 以上行已被注释掉。

因此,您的问题可能是您习惯于在每次运行应用程序时 onCreate 运行。即活动开始时。 但是SQLiteOpenHelper onCreate方法仅在创建数据库后运行一次。其他任何时间(即数据库存在时)都不会运行。

这样,您可能会因为未创建表而未找到该表,因为您已将代码添加到onCreate(用于创建表)而未删除数据库。

FIX:-

FIX 将执行以下一项操作:-

  • 通过“设置”删除应用程序的数据,或
  • 卸载应用程序(这将删除应用程序的数据)

完成上述操作之一后,请重新运行该应用程序,这可能会让您越过表格未找到错误。

用于测试的代码:-

DatabaseColumn.java

public class DatabaseColumn {
    public static final String MESSAGE_TABLE = "message_table";
    public static final String MESSAGE_NUMBERONE = "message_numberone";
    public static final String MESSAGE_NUMBERTWO = "messgae_numbertwo";
    public static final String MESSAGE_NUMBERTHREE = "message_numberthree";
}

DatabaseCreation.java

public class DatabaseCreation extends SQLiteOpenHelper {
    private static String DB_NAME = "secure.db";
    private static int DB_VERSION = 1;

    private String message_table =
            "CREATE TABLE " + DatabaseColumn.MESSAGE_TABLE + " ( " +
                    DatabaseColumn.MESSAGE_NUMBERONE + " TEXT, " +
                    DatabaseColumn.MESSAGE_NUMBERTWO + " TEXT, " +
                    DatabaseColumn.MESSAGE_NUMBERTHREE + " TEXT )";

    public DatabaseCreation(Context context){
        super(context, DB_NAME,null,DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //sqLiteDatabase.execSQL(contact_table); //<<<<<<<< ?????????
        sqLiteDatabase.execSQL(message_table);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
}

-注意注释掉的行(您可能不必注释掉)

DatabaseQueries.java

public class DatabaseQueries {
    DatabaseCreation db;

    public DatabaseQueries(Context context) {
        db =  new DatabaseCreation(context);
    }

    //!!!!!!!!!! Code other than this block has been assumed
    public long addMessageNumber(String numberone, String numbertwo, String numberthree){
        SQLiteDatabase sqLiteDatabase2=db.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(DatabaseColumn.MESSAGE_NUMBERONE,numberone);
        cv.put(DatabaseColumn.MESSAGE_NUMBERTWO,numbertwo);
        cv.put(DatabaseColumn.MESSAGE_NUMBERTHREE,numberthree);
        long result=sqLiteDatabase2.insert(DatabaseColumn.MESSAGE_TABLE,null,cv);
        sqLiteDatabase2.close();
        return result;
    }
}
  • 注意查看评论

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Button button;
    EditText editText1,editText2,editText3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = this.findViewById(R.id.button);
        editText1 = this.findViewById(R.id.edittext1);
        editText2 = this.findViewById(R.id.edittext2);
        editText3 = this.findViewById(R.id.edittext3);

        //!!!!!!!!!! Code other than this block has been assumed
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    //!!!!!!!!!! view.getContext() used instead of Main2Activity.this (code is easier to copy elsewhere)
                    DatabaseQueries db = new DatabaseQueries(view.getContext());
                    Log.e("data", editText1.getText().toString());
                    long result = db.addMessageNumber(
                            editText1.getText().toString(),
                            editText2.getText().toString(),
                            editText3.getText().toString()
                    );
                    if (result > 0) {
                        Toast.makeText(view.getContext(), "Inserted", Toast.LENGTH_SHORT).show();
                        Log.e("INSERTINFO","Row inserted."); //<<<<<<<<< ADDED FOR TESTING
                    } else {
                        Toast.makeText(view.getContext(), "Not Inserted", Toast.LENGTH_SHORT).show();
                        Log.e("INSERTINFO","Row NOT inserted."); //<<<<<<<<< ADDED FOR TESTING
                    }
                } catch (Exception e) {
                    e.getMessage();
                    e.printStackTrace();
                }
            }
        });
    }
}
  • 注意使用MainActivity代替Main2Activity
  • 查看评论。
  • 吐司面包与补木相辅相成。

测试结果

启动时首次运行:-

enter image description here

插入

在三个EditText中输入T1,T2和T3后,单击CLICKME按钮,日志将包含:-

2019-11-29 07:13:49.056 E/data: T1
2019-11-29 07:13:49.093 E/INSERTINFO: Row inserted.