شما چک کنید که آیا توی BroadCast مقدار cursor خالی هست یا نه اگر حالی نبود پس مشکلی با دیتابیس ندارید باید بقیه قسمت هارو چک کنید .
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
خواندن اطلاعات از دیتابیس در BordcastReciver
مدیریت گفتگو
آخرین تغییر: 10 سال پیش
سلام دوستان چطور میشه در زمان روشن کردن گوشی اطلاعاتی رو از دیتابیس برنامه بخونیم لطفا اهل فن کمک کنن
پاسخها 6
سلام من از کد زیر برای ست کردن آلارم استفاده میکنم
btnSet.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
sId = (int) System.currentTimeMillis();
Calendar c = Calendar.getInstance();
cursor = G.database.rawQuery("SELECT * FROM alarm WHERE alarm_check = " + sId, null);
while (cursor.moveToNext()) {
hour = cursor.getInt(cursor.getColumnIndex("alarm_hour"));
minute = cursor.getInt(cursor.getColumnIndex("alarm_minute"));
second = cursor.getInt(cursor.getColumnIndex("alarm_second"));
}
cursor.close();
calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, c.get(Calendar.MONTH));
calendar.set(Calendar.YEAR, c.get(Calendar.YEAR));
calendar.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.AM_PM, Calendar.PM);
Intent intent = new Intent(G.context, ActivityAlarm.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(G.context, (int) sId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
G.alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
});
و همه چی بخوبی کار میکنه حالا همین کدها رو هم تو BroadcastReciver مینویسم اما هنگام روشن شدن گوشی زمانهایی که بهش دادم کار نمیکنه
نظرات
سلام. منم همین مشکل رو داشتم. که بعد از یک روز تحقیق!! متوجه شدم مشکل از این بخشه:
G.alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
تابع set قدیمی شده و حالا برای درست تنظیم شدن آلارم باید از setExact استفاده کنی.
اینم از نمونه کد راه حل :
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, date.getYear());
calendar.set(Calendar.MONTH, date.getMonth());
calendar.set(Calendar.DAY_OF_MONTH, date.getDate());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
long triggerTimeInMS = calendar.getTimeInMillis();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTimeInMS , pendingIntent);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTimeInMS , pendingIntent);
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTimeInMS , pendingIntent);
}
alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTimeInMS , pendingIntent);
}
نظرات
ممنون از دوستان لطف کردین اما من تو برنامه مشکلی ندارم اما وقتی گوشی رو خاموش و روشن میکنم برنامه کار نمیکنه طبق راهنمایی آقای کاشی زاده انجام دادم تو برودکست اطلاعات از دیتابیس میخونه و تو Toast نمایش داده میشه اما در زمان مشخص شده آلارم نمیزنه
دوست عزیز دقیقا به خاطر همین موضوع هست که هشدارها در زمان موردنظر کار نمیکنه!
شما یک بار به جای set از setExact برای تنظیم آلارم استفاده کن و نتیجه رو بگو....
من با sdk 4.0.3 کار میکنم خطا میگیره عکسشو پایین میذارم. کدهای خودم تو برنامه درست جواب میده هیچ مشکلی نداره یعنی تا 10 تا آلارم هم بهش دادم و دقیق سر ساعت و دقیقه آلارم زده شده مشکل من زمانیکه گوشی رو خاموش میکنم و روشن میکنم هستش تو این حالت هم دیتابیس رو میخونه ولی آلارمی که قبلا تنظیم کردم نمیزنه
من با sdk 4.0.3 کار میکنم خطا میگیره عکسشو پایین میذارم. کدهای خودم تو برنامه درست جواب میده هیچ مشکلی نداره یعنی تا 10 تا آلارم هم بهش دادم و دقیق سر ساعت و دقیقه آلارم زده شده مشکل من زمانیکه گوشی رو خاموش میکنم و روشن میکنم هستش تو این حالت هم دیتابیس رو میخونه ولی آلارمی که قبلا تنظیم کردم نمیزنه
کد رو تو برودکست به این حالت تغییر میدم وقتی گوشی خاموش و روشن میکنم فقط آخرین آلارم تنظیمی رو میزنه
cursor = G.database.rawQuery("SELECT * FROM alarm WHERE alarm_check = "+ sId,null);
نظرات
فکر میکنم مشکل من تو همین خطه تو برنامه زمانیکه گوشی هنوز خاموش نشده
cursor = G.database.rawQuery("SELECT * FROM alarm WHERE alarm_check = " + sId, null); درست کار میکنه اما وقتی گوشی خاموش روشن شد تو برودکست کار نمیکنه
ببینید شما یک اشتباه دارید : وقتی درون حلقه while دارید اطلاعات مربوط به هر آلارم رو میخونید باید همونجا هم آلارم مربوطه رو بعد از خوندن اطلاعات تنظیم کنید. ولی شما اومدین اول تمام آلارم های موجود رو در حلقه while خوندین و ریختین تو hour , minute , second . در نتیجه این مقادیر همین طور پشت سر هم جایگزین میشن و هیچ آلارمی تنظیم نمیشه! تا آخرین مورد که از حلقه بیرون میاد و میره آلارم مربوطه رو تنظیم میکنه.
public class ActivityStartup extends Activity {
int sId;
private Calendar calendar;
public static Cursor cursor;
private int setHours, setMinutes, setSeconds;
private int hour, minute, second, i;
private EditText edtHours, edtMinutes, edtSeconds;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
edtHours = (EditText) findViewById(R.id.edtHours);
edtMinutes = (EditText) findViewById(R.id.edtMinutes);
edtSeconds = (EditText) findViewById(R.id.edtSeconds);
Button btnSet = (Button) findViewById(R.id.btnSet);
btnSet.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
sId = (int) System.currentTimeMillis();
Toast.makeText(G.context, "TIME CHANGED", Toast.LENGTH_LONG).show();
Log.i("LOG", "currentTimeMillis = : " + sId);
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH);
int m1 = m + 1;
int d = c.get(Calendar.DAY_OF_MONTH);
setHours = Integer.parseInt(edtHours.getText().toString());
setMinutes = Integer.parseInt(edtMinutes.getText().toString());
setSeconds = Integer.parseInt(edtSeconds.getText().toString());
G.database.execSQL("INSERT INTO alarm (alarm_hour,alarm_check,alarm_minute,alarm_second,alarm_year,alarm_month,alarm_day) VALUES (" + setHours + "," + sId + "," + setMinutes + "," + setSeconds + "," + y + "," + m1 + "," + d + ")");
cursor = G.database.rawQuery("SELECT * FROM alarm WHERE alarm_check = " + sId, null);
while (cursor.moveToNext()) {
hour = cursor.getInt(cursor.getColumnIndex("alarm_hour"));
minute = cursor.getInt(cursor.getColumnIndex("alarm_minute"));
second = cursor.getInt(cursor.getColumnIndex("alarm_second"));
i = cursor.getInt(cursor.getColumnIndex("alarm_check"));
Log.i("LOG", "hour = : " + hour);
Log.i("LOG", "minute = : " + minute);
Log.i("LOG", "second = : " + second);
Log.i("LOG", "i = : " + i);
}
cursor.close();
calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, c.get(Calendar.YEAR));
calendar.set(Calendar.MONTH, c.get(Calendar.MONTH));
calendar.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, second);
calendar.set(Calendar.AM_PM, Calendar.PM);
Intent intent = new Intent(G.context, ActivityAlarm.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(G.context, (int) sId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
G.alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
});
}
}
نظرات
ببینید شما یک اشتباه دارید : وقتی درون حلقه while دارید اطلاعات مربوط به هر آلارم رو میخونید باید همونجا هم آلارم مربوطه رو بعد از خوندن اطلاعات تنظیم کنید. ولی شما اومدین اول تمام آلارم های موجود رو در حلقه while خوندین و ریختین تو hour , minute , second . در نتیجه این مقادیر همین طور پشت سر هم جایگزین میشن و هیچ آلارمی تنظیم نمیشه! تا آخرین مورد که از حلقه بیرون میاد و میره آلارم مربوطه رو تنظیم میکنه. (اینو گذاشتم که ببینیش)
نمیدونم شاید کدم اشتباه باشه اما تا وقتی گوشی خاموش نکردم و تو برنامه هستم خوب کار میکنه مقادیر هم چک کردم تو دیتابیس save میشن ولی بعد از اینکه گوشی خاموش میکنم و روشن میکنم دیگه کار نمیکنه
چی گذاشتین من ببینم ؟ چیزی ندیدم...
خب ممکنه اونجا کدت متفاوت باشه!
حالا شما اینو امتحان کن و آلارم ها رو داخل حلقه while تنظیم کن. به احتمال 99% درست میشه!
parsi bit عزیز انجام دادم ولی متاسفانه بازم جواب نداد.
البته کدهام تو Broadcast هم دقیقا همینه واسه همین دوباره کپیش نکردم. موندم چه کنم
ublic class G extends Application {
public static AlarmManager alarmManager;
public static Context context;
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/database-test/";
public static LayoutInflater inflater;
public static String packageName;
public static String DIR_APP;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
packageName = context.getPackageName();
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
DIR_APP = DIR_SDCARD + "/android/data/" + packageName;
new File(DIR_APP).mkdirs();
database = SQLiteDatabase.openOrCreateDatabase(DIR_APP + "/mydb", null);
database.execSQL("CREATE TABLE IF NOT EXISTS alarm (" +
"alarm_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , " +
"alarm_year INTEGER, " +
"alarm_month INTEGER, " +
"alarm_day INTEGER, " +
"alarm_hour INTEGER, " +
"alarm_minute INTEGER, " +
"alarm_second INTEGER," +
"alarm_check INTEGER," +
"alarm_time TEXT" +
")");
// database.execSQL("INSERT INTO alarm (alarm_year,alarm_month,alarm_month) VALUES (2016,10,10 )");
}
}
نظرات
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام

نظرات