- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我创建了 3 个类(1. MainActivity、DBhelper 和 Student 类)。我是初学者,使用简单的代码,并且一直在将 DBhelper 类与 MainActivity 连接时遇到问题。我认为一切正常,但单击“buttonAdd”后,我收到一条声明“我的应用程序已停止”。在 MainActivity 中,我只使用了 DBhelper 中的“loadStudents”和“addStudent”方法,因为即使在这些基本级别上我也遇到问题。
应用程序的想法 --> 将新学生添加到 editText,删除它们等。我知道,更好的是使用scrollList,但我只想知道如何首先使用 SQLite。
Student 类 --> 我在“DBhelper 类”和“MainActivity”中使用它
public class Student {
private int studentID;
private String studentName;
public Student(int id, String studentName) { //konstruktor
this.studentID = id;
this.studentName = studentName;
}
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
DBhelper类
public class DBhelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "studentDB.db";
public static final String TABLE_NAME = "student";
public static final String COLUMN_ID = "studentID";
public static final String COLUMN_NAME = "studentName";
//initialize the database
public DBhelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "("
+ COLUMN_ID + "INTEGER PRIMARYKEY,"
+ COLUMN_NAME + " TEXT " + ")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
public void addStudent(Student student) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, student.getStudentID());
values.put(COLUMN_NAME, student.getStudentName());
db.insert(TABLE_NAME, null, values);
db.close();
}
public String loadStudents() {
String result = "";
String query = "Select*FROM " + TABLE_NAME;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
while (cursor.moveToNext()) {
int result_0 = cursor.getInt(0);
String result_1 = cursor.getString(1);
result += String.valueOf(result_0) + " " + result_1 +
System.getProperty("line.separator");
}
cursor.close();
db.close();
return result;
}
public Student findStudent(int ID, String studentName) {
String query = "Select * FROM " + TABLE_NAME + "WHERE" + COLUMN_NAME + "
= " + "'" + studentName + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Student student = new Student(ID, studentName);
if (cursor.moveToFirst()) {
cursor.moveToFirst();
student.setStudentID(Integer.parseInt(cursor.getString(0)));
student.setStudentName(cursor.getString(1));
cursor.close();
} else {
student = null;
}
db.close();
return student;
}
public boolean deleteStudent(int ID, String studentName) {
boolean result = false;
String query = "Select*FROM" + TABLE_NAME + "WHERE" + COLUMN_ID + "= '"
+ String.valueOf(ID) + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Student student = new Student(ID, studentName);
if (cursor.moveToFirst()) {
student.setStudentID(Integer.parseInt(cursor.getString(0)));
db.delete(TABLE_NAME, COLUMN_ID + "=?",
new String[] {
String.valueOf(student.getStudentID())
});
cursor.close();
result = true;
}
db.close();
return result;
}
public boolean updateStudent(int ID, String name) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues args = new ContentValues();
args.put(COLUMN_ID, ID);
args.put(COLUMN_NAME, name);
return db.update(TABLE_NAME, args, COLUMN_ID + "=" + ID, null) > 0;
}
}
主要 Activity
public class MainActivity extends AppCompatActivity {
Button buttonLoad;
Button buttonAdd;
Button buttonFind;
Button buttonDelete;
Button buttonUpdate;
TextView textViewStudents;
EditText editTextID;
EditText editTextName;
DBhelper myDB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonLoad = (Button) findViewById(R.id.buttonLoad);
buttonAdd = (Button) findViewById(R.id.buttonAdd);
buttonFind = (Button) findViewById(R.id.buttonFind);
buttonDelete = (Button) findViewById(R.id.buttonDelete);
buttonUpdate = (Button) findViewById(R.id.buttonUpdate);
textViewStudents = (TextView) findViewById(R.id.textViewStudents);
editTextID = (EditText) findViewById(R.id.editTextID);
editTextName = (EditText) findViewById(R.id.editTextName);
myDB = new DBhelper(this);
//load
buttonLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textViewStudents.setText(myDB.loadStudents());
editTextID.setText("");
editTextName.setText("");
}
});
buttonAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int id = Integer.parseInt(editTextID.getText().toString());
String name = editTextName.getText().toString();
Student student = new Student(id, name);
myDB.addStudent(student);
editTextID.setText("");
editTextName.setText("");
}
});
}
// Maybe it will be better to use the methos under the onCreate method but I
//don't know what should I write as a paramether instead of "view" when I
//will use this method in the onCreate
// public void addStudent() {
// DBhelper myDB = new DBhelper(this);
// int id = Integer.parseInt(editTextID.getText().toString());
// String name = editTextName.getText().toString();
// Student student = new Student(id, name);
// myDB.addStudent(student);
// editTextID.setText("");
// editTextName.setText("");
// }
}
最佳答案
在 loadStudents
方法中,您有 String query = "Select*FROM "+ TABLE_NAME;
这将导致语法错误,因为 SELECT 和 * 以及 * 和 FROM 之间没有空格。
这应该是字符串查询 = "Select * FROM "+ TABLE_NAME;
您需要检查代码是否缺少空格,因为您省略了数字。
列名和类型之间有一个空格,PRIMARY 和 KEY 之间也有一个空格,因此,studentID 不会是 rowid 列的别名,因此将为 null,而不是自动生成的唯一 ID。 **如果不修复(不会导致错误),将导致 find/delete/update/Students 方法无法按预期工作。
WHERE 关键字之前缺少一个空格 TABLE_NAME + "WHERE"
。
相同的初始错误Select*FROM
在deleteStudent方法中被复制。
注意可能还有其他语法错误,以上仅通过直观查看代码才发现。
我建议进行所有修改,然后删除应用程序的数据或卸载应用程序或增加分配给 DATABASE_VERSION 的值,然后重新运行应用程序。
您还应该在“它停止工作”之后检查日志,它会详细说明遇到的错误。
以下是经过测试的代码,也包含一些建议,例如仅使用学生的 id 来定位学生。
DBhelper.java 类(请注意,为了方便起见,使用了 DBhelper2 类):-
public class DBhelper2 extends SQLiteOpenHelper { //<<<<<<<<<< Change DBhelper2 to DBhelper
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "studentDB.db";
public static final String TABLE_NAME = "student";
public static final String COLUMN_ID = "studentID";
public static final String COLUMN_NAME = "studentName"; //initialize the database
public DBhelper2(Context context) { //<<<<<<<<<< Change DBhelpe2 to DBhelper
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY,"
+ COLUMN_NAME + " TEXT " + ")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
public void addStudent(Student student) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_ID, student.getStudentID());
values.put(COLUMN_NAME, student.getStudentName());
db.insert(TABLE_NAME, null, values);
db.close();
}
//<<<<<<<<<< ADDED add student allowing ID to be auto generated
//!!!NOTE!!! ideally long should be used for ID and thus should return long not int
// won't be an issue with a small number of Students
public int addNewStudent(String studentName) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME,studentName);
return (int) db.insert(TABLE_NAME,null,values);
}
public String loadStudents() {
String result = "";
String query = "Select * FROM " + TABLE_NAME; //<<<<<<<<<< ADDED SPACES
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
while (cursor.moveToNext()) {
int result_0 = cursor.getInt(0);
String result_1 = cursor.getString(1);
result += String.valueOf(result_0) + " " + result_1 +
System.getProperty("line.separator");
}
cursor.close();
db.close();
return result;
}
//<<<<<<<<<< Get all Students as an ArrayList of Student objects
//<<<<<<<<<< Alternative to loadStudents
public ArrayList<Student> getAllStudents() {
ArrayList<Student> result = new ArrayList<>();
SQLiteDatabase db = this.getWritableDatabase();
Cursor csr = db.query(TABLE_NAME,null,null,null,null,null,null);
while (csr.moveToNext()) {
result.add(
new Student(
csr.getInt(csr.getColumnIndex(COLUMN_ID)),
csr.getString(csr.getColumnIndex(COLUMN_NAME)
)
)
);
}
csr.close();
db.close();
return result;
}
public Student findStudent(int ID, String studentName) {
String query = "Select * FROM " + TABLE_NAME + " WHERE " + COLUMN_NAME + //<<<<<<<<<< ADDED SPACES
" = " + "'" + studentName + "'"; //<<<<<<<<<< ADDED missing double quote
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Student student = new Student(ID, studentName);
if (cursor.moveToFirst()) {
cursor.moveToFirst(); //<<<<<<<<<< NOT NEEDED as already at first
student.setStudentID(Integer.parseInt(cursor.getString(0)));
student.setStudentName(cursor.getString(1));
cursor.close();
} else {
student = null;
}
db.close();
return student;
}
//<<<<<<<<<< alternative get student just by id
// uses the convenience query method rather than rawQuery
// recommended to use COLUMN NAMES not column offsets
public Student findStudent(int studentID) {
Student result = null;
String whereclause = COLUMN_ID + "=?";
String[] whereargs = new String[]{String.valueOf(studentID)};
SQLiteDatabase db = this.getWritableDatabase();
Cursor csr = db.query(TABLE_NAME,null,whereclause,whereargs,null,null,null);
if (csr.moveToFirst()) {
result = new Student(
csr.getInt(csr.getColumnIndex(COLUMN_ID)),
csr.getString(csr.getColumnIndex(COLUMN_NAME)
)
);
}
csr.close();
db.close();
return result;
}
// Deleting just by id (see findStudent above) could/should be implemented
public boolean deleteStudent(int ID, String studentName) {
boolean result = false;
String query = "Select * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + "= '" //<<<<<<<<<< ADDED SPACES
+ String.valueOf(ID) + "'";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(query, null);
Student student = new Student(ID, studentName);
if (cursor.moveToFirst()) {
student.setStudentID(Integer.parseInt(cursor.getString(0)));
db.delete(TABLE_NAME, COLUMN_ID + "=?",
new String[] {
String.valueOf(student.getStudentID())
});
cursor.close();
result = true;
}
db.close();
return result;
}
// Updating just by id (see findStudent above) could/should be implemented
public boolean updateStudent(int ID, String name) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues args = new ContentValues();
args.put(COLUMN_ID, ID);
args.put(COLUMN_NAME, name);
return db.update(TABLE_NAME, args, COLUMN_ID + "=" + ID, null) > 0;
}
}
Activity 的 onCreate
方法中的以下代码用于测试上述内容:-
mDBStudents = new DBhelper2(this);
//Delete all students for testing purposes only
mDBStudents.getWritableDatabase().delete(DBhelper2.TABLE_NAME,null,null);
// Load some data and test methods
mDBStudents.addStudent(new Student(1,"Fred"));
mDBStudents.addStudent(new Student(2,"Mary"));
Log.d("STUDENTS",mDBStudents.loadStudents());
Student a_student_found = mDBStudents.findStudent(1,"Fred");
Log.d("STUDENTFOUND", a_student_found.getStudentName());
mDBStudents.updateStudent(1,"Bert");
a_student_found = mDBStudents.findStudent(1,"Bert");
Log.d("STUDENtFOUND",a_student_found.getStudentName());
mDBStudents.deleteStudent(2,"Mary");
Log.d("STUDENTS",mDBStudents.loadStudents());
//Test alternative suggested methods
mDBStudents.addNewStudent("Harold");
mDBStudents.addNewStudent("Susan");
ArrayList<Student> all_students = mDBStudents.getAllStudents();
boolean after_first_row = false;
StringBuilder sb = new StringBuilder("Students are :-");
for (Student s: mDBStudents.getAllStudents()) {
sb.append("\n\t")
.append("Student ID is ")
.append(String.valueOf(s.getStudentID()))
.append(" Student name is ")
.append(s.getStudentName());
}
Log.d("STUDENTS",sb.toString());
Student another = mDBStudents.findStudent(3);
Log.d("STUDENT 3","Student with an ID of 3 is " + another.getStudentName());
以下是测试生成的日志的输出:-
2018-10-06 08:49:27.410 2382-2382/so52598847.so52598847 D/STUDENTS: 1 Fred
2 Mary
2018-10-06 08:49:27.411 2382-2382/so52598847.so52598847 D/STUDENTFOUND: Fred
2018-10-06 08:49:27.418 2382-2382/so52598847.so52598847 D/STUDENtFOUND: Bert
2018-10-06 08:49:27.426 2382-2382/so52598847.so52598847 D/STUDENTS: 1 Bert
2018-10-06 08:49:27.444 2382-2382/so52598847.so52598847 D/STUDENTS: Students are :-
Student ID is 1 Student name is Bert
Student ID is 2 Student name is Harold
Student ID is 3 Student name is Susan
2018-10-06 08:49:27.445 2382-2382/so52598847.so52598847 D/STUDENT 3: Student with an ID of 3 is Susan
结果符合预期。那就是
关于java - 如何将 SQLiteOpenHelper 类与 MainActivity 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52673225/
我知道这个问题可能已经被问过,但我检查了所有这些,我认为我的情况有所不同(请友善)。所以我有两个数据集,第一个是测试数据集,第二个是我保存在数据框中的预测(预测值,这就是没有数据列的原因)。我想合并两
在 .loc 方法的帮助下,我根据同一数据框中另一列中的值来识别 Panda 数据框中某一列中的值。 下面给出了代码片段供您引用: var1 = output_df['Player'].loc[out
当我在 Windows 中使用 WinSCP 通过 Ubuntu 连接到 VMware 时,它提示: The server rejected SFTP connection, but it lis
我正在开发一个使用 xml web 服务的 android 应用程序。在 wi-fi 网络中连接时工作正常,但在 3G 网络中连接时失败(未找到 http 404)。 这不仅仅发生在设备中。为了进行测
我有一个XIB包含我的控件的文件,加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。 文件的所有者被设置为 someClassController
我在本地计算机上管理 MySQL 数据库,并通过运行以下程序通过 C 连接到它: #include #include #include int main(int argc, char** arg
我不知道为什么每次有人访问我网站上的页面时,都会打开一个与数据库的新连接。最终我到达了大约 300 并收到错误并且页面不再加载。我认为它应该工作的方式是,我将 maxIdle 设置为 30,这意味着
希望清理 NMEA GPS 中的 .txt 文件。我当前的代码如下。 deletes = ['$GPGGA', '$GPGSA', '$GPGSV', '$PSRF156', ] searchquer
我有一个 URL、一个用户名和一个密码。我想在 C# .Net WinForms 中建立 VPN 连接。 你能告诉我从哪里开始吗?任何第三方 API? 代码示例将受到高度赞赏... 最佳答案 您可以像
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
我正在编写一个库,它不断检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。 https://github.com/muddassir235/connection_ch
我的操作系统:Centos 7 + CLOUDLINUX 7.7当我尝试从服务器登录Mysql时 [root@server3 ~]# Mysql -u root -h localhost -P 330
我收到错误:Puma 发现此错误:无法打开到本地主机的 TCP 连接:9200(连接被拒绝 - 连接(2)用于“本地主机”端口 9200)(Faraday::ConnectionFailed)在我的
请给我一些解决以下错误的方法。 这是一个聊天应用....代码和错误如下:: conversations_controller.rb def create if Conversation.bet
我想将两个单元格中的数据连接到一个单元格中。我还想只组合那些具有相同 ID 的单元格。 任务 ID 名称 4355.2 参与者 4355.2 领袖 4462.1 在线 4462.1 快速 4597.1
我经常需要连接 TSQL 中的字段... 使用“+”运算符时 TSQL 强制您处理的两个问题是 Data Type Precedence和 NULL 值。 使用数据类型优先级,问题是转换错误。 1)
有没有在 iPad 或 iPhone 应用程序中使用 Facebook 连接。 这个想法是登录这个应用程序,然后能够看到我的哪些 facebook 用户也在使用该应用程序及其功能。 最佳答案 是的。
我在连接或打印字符串时遇到了一个奇怪的问题。我有一个 char * ,可以将其设置为字符串文字的几个值之一。 char *myStrLiteral = NULL; ... if(blah) myS
对于以下数据 - let $x := "Yahooooo !!!! Select one number - " let $y := 1 2 3 4 5 6 7 我想得到
我正在看 UDEMY for perl 的培训视频,但是视频不清晰,看起来有错误。 培训展示了如何使用以下示例连接 2 个字符串: #!usr/bin/perl print $str = "Hi";
我是一名优秀的程序员,十分优秀!