我正在尝试在android中创建一个数据库并尝试将两个数据保存到其中。 我的 dataBaseHelper 文件如下
package com.example.imad.sos;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class DataBaseHelper extends SQLiteOpenHelper {
public static final String databaseName = "sostable.db";
public static final String tableName = "sostable";
public static final String nameColum = "name";
public static final String phoneColum = "phonenumber";
public DataBaseHelper(Context context) {
super(context, databaseName, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists "+tableName);
onCreate(db);
}
public boolean insertData(String name, String phone)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(nameColum, name);
contentValues.put(phoneColum, phone);
long result = db.insert(tableName, null, contentValues);
if(result == -1)
{
return false;
}
else
{
return true;
}
}
}
这是我尝试将数据插入数据库的 AddContact 活动:
DataBaseHelper dataBaseHelper = new DataBaseHelper(this);
boolean insertSuccess;
String name = txtName.getText().toString();
String phone = txtPhone.getText().toString();
if(name.equals("") || phone.equals("")) {
Toast.makeText(AddContacts.this, "One of the fields is empty",Toast.LENGTH_LONG).show();
} else {
insertSuccess = dataBaseHelper.insertData(name, phone);
if(insertSuccess == true) {
Toast.makeText(AddContacts.this, "Insertion Successful", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(AddContacts.this, "Insertion Failed", Toast.LENGTH_LONG).show();
}
}
这是我的清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.imad.sos">
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AddContacts" />
<activity android:name=".ShowContacts"></activity>
</application>
</manifest>
每当我在 AddContacts 中运行代码时,会弹出消息插入失败。我是新手,在我的代码中找不到错误。提前谢谢。
答案 0 :(得分:0)
我认为问题在于您的列名不匹配。
使用db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");
因此,列名称将为名称和 phonenum 。
但是,在insertData方法中,派生列名称将为 phonenumber 。
要解决此问题,您可以
1)将db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");
更改为db.execSQL("create table " + tableName +" ( name text primary key,phonenumber text)");
。 (*)然后您需要删除应用程序的数据,卸载应用程序或增加数据库版本(super(context, databaseName, null, 1);
的第4个参数)。
2)将public static final String phoneColum = "phonenumber";
更改为public static final String phoneColum = "phonenum";
我建议您而不是上述任何内容,而是始终使用单个来源列名称并将db.execSQL("create table " + tableName +" ( name text primary key,phonenum text)");
更改为: -
db.execSQL("create table " + tableName +" (" + nameColum + " text primary key," + phoneColum + " text)");
(*)这需要您删除App的数据,卸载App或增加数据库版本号。
(*)需要删除App。卸载它或增加数据库版本,是因为只有在数据库不存在时才会自动调用onCreate
方法。前两个删除数据库,因此调用onCreate
。增加数据库版本会导致调用onUpgrade
方法。请注意,这三种方法都会导致现有数据丢失。