Android Studio和SQLite的新功能,我们将不胜感激。
创建一个应用程序,其中某人输入他们的朋友详细信息并将其添加到数据库。
我已经创建了我的数据库类和我的活动来添加朋友,但每当我尝试将它们添加到数据库时,我在logcat中收到错误说明:
11-16 20:40:20.083 2641-2641/com.example.kod45.myapplication E/SQLiteDatabase: Error inserting EMAIL=pm@gmail.com NAME=paul ID=1 SURNAME=pail
android.database.sqlite.SQLiteException: table friends_table has no column named EMAIL (code 1): , while compiling: INSERT INTO friends_table(EMAIL,NAME,ID,SURNAME) VALUES (?,?,?,?)
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(table friends_table has no column named EMAIL (code 1): , while compiling: INSERT INTO friends_table(EMAIL,NAME,ID,SURNAME) VALUES (?,?,?,?))
这是我的数据库处理程序:
public class DBHandler extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "Friends.db";
public static final String TABLE_NAME = "friends_table";
public static final String ID_COL = "ID";
public static final String EMAIL = "EMAIL";
public static final String FIRST_NAME = "NAME";
public static final String SURNAME = "SURNAME";
public DBHandler(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db)
{
String CREATE_FRIENDS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ ID_COL + " INTEGER PRIMARY KEY,"
+ EMAIL + "TEXT,"
+ FIRST_NAME + "TEXT,"
+ SURNAME + "TEXT" + ")";
db.execSQL(CREATE_FRIENDS_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
// example of drop old tables and Re-
//create tables.
//you can alter tables such as add
//columns, etc. but not drop tables
db.execSQL("drop table if exists "
+ TABLE_NAME);
onCreate(db);
}
public void addNewFriend(Friend newFriend)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ID_COL, newFriend.getFriendID());
values.put(EMAIL, newFriend.getEmailAddress());
values.put(FIRST_NAME, newFriend.getFirstName());
values.put(SURNAME, newFriend.getSurname());
db.insert(TABLE_NAME, null, values);
db.close();
}
public ArrayList<Friend> getAllFriends()
{
ArrayList<Friend> friendList = new ArrayList<Friend>();
String selectQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if(cursor.moveToFirst()) {
do
{
Friend friend = new Friend();
friend.setFriendID(Integer.parseInt(cursor.getString(0)));
friend.setEmailAddress(cursor.getString(1));
friend.setFirstName(cursor.getString(2));
friend.setSurname(cursor.getString(3));
//Adding to list
friendList.add(friend);
}
while (cursor.moveToNext()) ;
}
return friendList;
}
}
以及我如何添加:
public class AddFriends extends AppCompatActivity {
DBHandler myDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_friends);
myDB = new DBHandler(this);
}
public void addFriend(View v) {
EditText email = (EditText) findViewById(R.id.emailText);
EditText firstName = (EditText) findViewById(R.id.firstnameText);
EditText surname = (EditText) findViewById(R.id.surnameText);
EditText id = (EditText) findViewById (R.id.idText);
Button addData = (Button)findViewById(R.id.addFriendButton);
//Passing them as strings
String emailString = email.getText().toString();
String firstNameString = firstName.getText().toString();
String surnameString = surname.getText().toString();
int idNum = Integer.parseInt(id.getText().toString());
String emailPattern = "[a-zA-Z0-9._-]+@[a-z0-9]+\\.+[a-z0-9]+";
if(emailString.matches(emailPattern))
{
Friend friend = new Friend(idNum, emailString, firstNameString, surnameString);
myDB.addNewFriend(friend);
// startActivity(new Intent(this, ViewAllFriends.class));
}
else
{
Toast.makeText(this, "Email not valid", Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_home) {
startActivity(new Intent(this, MainActivity.class));
}
else if(id == R.id.action_search)
{
// startActivity(new Intent(this, SearchFriends.class));
Toast.makeText(this, "Already on Add Friend Page", Toast.LENGTH_SHORT).show();
}
else if(id == R.id.action_view)
{
// startActivity(new Intent(this, ViewAllFriends.class));
Toast.makeText(this, "Already on Add Friend Page", Toast.LENGTH_SHORT).show();
}
else if(id == R.id.action_add){
Toast.makeText(this, "Already on# Add Friend Page", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:1)
您的表创建SQL在最后3列的列名和列类型之间没有空格。
更改
String CREATE_FRIENDS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ ID_COL + " INTEGER PRIMARY KEY,"
+ EMAIL + "TEXT,"
+ FIRST_NAME + "TEXT,"
+ SURNAME + "TEXT" + ")";
来: -
String CREATE_FRIENDS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ ID_COL + " INTEGER PRIMARY KEY,"
+ EMAIL + " TEXT,"
+ FIRST_NAME + " TEXT,"
+ SURNAME + " TEXT" + ")";
然后执行以下
的一个public static final int DATABASE_VERSION = 1;
更改为public static final int DATABASE_VERSION = 2;
并重新运行该应用程序。您可能还希望考虑以下事项:
1)您可以使用以下方法简化光标循环: -
while(cursor.moveToNext) {
....
}
2)您可以通过利用光标的getColumnIndex(columnname)
方法而不是对偏移进行硬编码来减少确定/计算列偏移的问题。
对于1和2,您的代码可以是: -
while(cursor.moveToNext()) {
Friend friend = new Friend();
friend.setFriendID(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ID_COL))));
friend.setEmailAddress(cursor.getString(cursor.getColumnIndex(EMAIL)));
friend.setFirstName(cursor.getString(cursor.getColumnIndex(FIRST_NAME)));
friend.setSurname(cursor.getString(cursor.getColumnIndex(SURNAME)));
//Adding to list
friendList.add(friend);
}
答案 1 :(得分:-1)
这是一个非常容易修复的错误, 你应该基本上阅读错误信息,这是你职业生涯的一部分 你有一个插入错误,因为......
table friends_table没有名为EMAIL的列(代码1):
那你觉得怎么样? 当然,您必须创建一个EMAIL列。 您当然会想到您创建了电子邮件,但您错过的是空格。基本上,当您创建表时,您必须注意SQL查询是否完美形成。
所以反而写#34; TEXT&#34;你应该写&#34; TEXT&#34;在EMAIL和SURNAME字段上留下空格,因为它们写错了。
另外你应该考虑如果你使用模拟器或设备运行你的应用程序之前必须uninstall
你的应用程序,这样当你重新启动Run时,将从头开始安装一个新的&#34;正确&#34;数据库。