Android开发:输入姓名后展示、存库及添加闹钟实现求助
解决姓名存储展示与闹钟功能的实现方案
Hey Kaylee,我看了你的需求和代码,咱们一步步来搞定这两个问题:
一、姓名的存储与展示问题
你的代码已经有了DBHelper的雏形,但还有几个关键问题要修复,同时得完善输入姓名后的存储和展示逻辑:
1. 修复DBHelper的核心问题
你的DBHelper存在构造函数错误、建表语句不匹配、插入操作未完成的问题,修改后的代码如下:
import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "accountDB.db"; private static final String DATABASE_TABLE = "Account"; private static final String COL1 = "AccountName"; private static final String COL2 = "Time"; // 修正无参构造,传入Context public DBHelper(Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { // 建表语句和定义的列名保持一致 db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + COL1 + " TEXT, " + COL2 + " TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); onCreate(db); } // 完善插入方法,完成数据库插入操作 public void insertRecord(String accountName, String time) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contents = new ContentValues(); contents.put(COL1, accountName); contents.put(COL2, time); // 执行插入 db.insert(DATABASE_TABLE, null, contents); // 关闭数据库连接 db.close(); } // 添加查询方法,用于获取已存储的姓名 public String getStoredAccountName() { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(DATABASE_TABLE, new String[]{COL1}, null, null, null, null, null); String name = null; if (cursor.moveToFirst()) { name = cursor.getString(cursor.getColumnIndex(COL1)); } cursor.close(); db.close(); return name; } }
2. 完善姓名输入、存储与展示逻辑
在MainActivity的登录对话框确认事件里,获取用户输入的姓名,存入数据库,并展示出来:
// 替换你原来的PositiveButton点击事件 builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // 获取输入的姓名 AlertDialog accountDialog = (AlertDialog) dialog; EditText inputName = accountDialog.findViewById(R.id.edt_input_name); // 假设你的accountname布局里的EditText id是这个 String userName = inputName.getText().toString().trim(); if (!userName.isEmpty()) { // 存入数据库 DBHelper dbHelper = new DBHelper(MainActivity.this); dbHelper.insertRecord(userName, ""); // 这里暂时传空字符串,后面闹钟功能会填充时间 // 展示姓名,比如你可以在布局里加一个TextView,id设为tv_user_name TextView userNameTv = findViewById(R.id.tv_user_name); userNameTv.setText("欢迎你," + userName + "!"); Toast.makeText(MainActivity.this, "姓名已保存", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "请输入姓名", Toast.LENGTH_SHORT).show(); } } });
另外,你原来的Account c = new Account();判断逻辑有问题,应该改成从数据库查询是否已有账户:
DBHelper dbHelper = new DBHelper(this); String storedName = dbHelper.getStoredAccountName(); if (storedName == null) { // 没有账户,弹出登录对话框 showLoginDialog(); } else { // 已有账户,直接展示姓名 TextView userNameTv = findViewById(R.id.tv_user_name); userNameTv.setText("欢迎你," + storedName + "!"); }
二、日期时间闹钟功能实现
结合你代码里的Spinner,我们可以用AlarmManager来实现闹钟功能,步骤如下:
1. 创建闹钟广播接收器
新建一个AlarmReceiver类,用于接收闹钟触发事件并发送通知:
import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; public class AlarmReceiver extends BroadcastReceiver { private static final String CHANNEL_ID = "reminder_channel"; @Override public void onReceive(Context context, Intent intent) { // 创建通知渠道(Android 8.0+需要) createNotificationChannel(context); // 构建通知 Notification notification = new Notification.Builder(context, CHANNEL_ID) .setContentTitle("提醒") .setContentText("到时间啦!") .setSmallIcon(R.drawable.ic_notification) // 替换成你的通知图标 .setAutoCancel(true) .build(); // 发送通知 NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(1, notification); } private void createNotificationChannel(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "提醒通知", NotificationManager.IMPORTANCE_DEFAULT); NotificationManager manager = context.getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } } }
2. 在MainActivity中设置闹钟
在你选择时间的Spinner的onItemSelected方法里,实现闹钟设置逻辑:
import java.util.Calendar; // 解析时间并设置闹钟 public void setAlarm(String timeStr) { // 解析时间(假设Spinner选项格式为"14:30") String[] timeParts = timeStr.split(":"); int hour = Integer.parseInt(timeParts[0]); int minute = Integer.parseInt(timeParts[1]); // 设置Calendar时间 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); // 如果设置的时间已经过去,设置为明天的这个时间 if (calendar.getTimeInMillis() < System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 1); } // 创建Intent和PendingIntent Intent intent = new Intent(this, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE); // 获取AlarmManager并设置闹钟 AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else { alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } Toast.makeText(this, "闹钟已设置", Toast.LENGTH_SHORT).show(); } // 在onItemSelected里调用(如果用Spinner选择时间) @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (parent.getId() == R.id.SpinnerTime) { String selectedTime = parent.getItemAtPosition(position).toString(); setAlarm(selectedTime); // 同时可以把时间存入数据库,关联用户姓名 DBHelper dbHelper = new DBHelper(this); String userName = dbHelper.getStoredAccountName(); if (userName != null) { dbHelper.insertRecord(userName, selectedTime); } } else { String text = parent.getItemAtPosition(position).toString(); Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show(); } }
3. 配置权限和接收器
在AndroidManifest.xml里添加权限和注册接收器:
<!-- 闹钟权限 --> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <!-- 注册广播接收器 --> <receiver android:name=".AlarmReceiver" />
最后注意事项
- 确保你的布局文件(activity_main.xml、account.xml、accountname.xml)里的控件ID和代码里的一致,比如accountname.xml里的EditText要设置id为
edt_input_name,activity_main.xml里添加展示姓名的TextView - Android 12+需要申请
POST_NOTIFICATIONS权限,记得在代码里动态申请 - 数据库操作最好放在子线程里,避免阻塞主线程,你可以用AsyncTask或者Coroutines来实现
内容的提问来源于stack exchange,提问作者Kaylee




