You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动