/*
首次安装时,调用SQLiteOpenHelper的onCreate()方法创建库test.db及表person
以后运行时,若数据库没有版本提升,则以可读写方式直接打开数据库;
SQLite数据库属于内部存储,在应用卸载时将被删除,而再次安装时不会被删除;
若有版本提升,则先执行onUpgrade()方法后,再以可读写方式打开数据库
*/
package com.example.example7_1;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import android.R;
public class MainActivity extends AppCompatActivity {
SQLiteDatabase db;
Cursor cursor;
StringBuilder result=new StringBuilder("程序所做的工作:\n");
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyDbOpenHelper helper = new MyDbOpenHelper(this);
db = helper.getWritableDatabase(); //数据库文件句柄
cursor = db.rawQuery("select * from person", null);
Toast.makeText(this, "查询到" + cursor.getCount() + "记录。", Toast.LENGTH_SHORT).show();
result.append("—查询了数据表并统计了记录数。\n");
textView = findViewById(R.id.textView);
textView.setText(result);
}
class MyDbOpenHelper extends SQLiteOpenHelper { //内部工具类
public MyDbOpenHelper(Context context) { //构造方法
//必须调用抽象父类的构造方法,第4参数为数据库版本
super(context, "test.db", null,1); //建立或打开库
result.append("—创建或打开数据库;\n");
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "创建数据库表...", Toast.LENGTH_SHORT).show();
db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");
db.execSQL("insert into person values(null,'Wu')");
db.execSQL("insert into person values(null,'Guan')");
result.append("—创建数据表并添加记录;\n");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Toast.makeText(MainActivity.this, "数据库表更新中...", Toast.LENGTH_SHORT).show();
db.execSQL("ALTER TABLE person ADD tel CHAR(20)");
db.execSQL("update person set tel='15527643858' where name='Wu'");
db.execSQL("update person set tel='1340862750' where name='Guan'");
result.append("—修改了数据表结构和记录;\n");
}
}
}
原因是:
在Android开发中,每个应用程序都会自动生成一个名为R
的类,其中包含了应用程序中所有的资源的引用。这个R
类是应用程序特有的,用于在代码中引用资源,如布局文件、字符串、图片等。当您使用import com.example.example7_1.R;
时,您正在导入的是您自己应用程序的资源。
另一方面,android.R
是Android框架的资源类,它包含了Android SDK中定义的所有资源。虽然在某些情况下开发者可能会直接使用android.R
来引用Android系统自带的资源,但在大多数情况下,直接使用import android.R
并不是必须的,而且可能会导致命名冲突。
在您的代码中,您正在尝试引用一个TextView
,这个TextView
是在您的应用程序的布局文件activity_main.xml
中定义的。因此,您应该使用您自己应用程序的R
类来引用这个TextView
。这就是为什么您需要将导入语句:
import android.R;
更改为:
import com.example.example7_1.R;
报错结束
同理如果在代码中出现MainActivity.java文件存在但是报错,考虑是不是
package com.example.example7_1;
被自己搞丢了。