کلیدستان

نسخه‌ی کامل: سیستم امتیازدهی سمت سرور (در برنامه نویسی اندروید)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
من برای مطالبی که تو برنامم دارم یه ratingbar گذاشتم و مقدار دیفالت رو هم برای نمایش روش ست کردم. با امتیاز دهی توسط کاربر مقدار رو سمت سرور میفرستم و ذخیره می کنم. تو این مراحلش مشکلی ندارم.
اما چیزی که نمیدونم اینه :

یه ستون داریم به اسم rate که امتیاز رو مشخص میکنه
یه ستون داریم به اسم numrate که تعداد نفراتی که تاحالا امتیاز دادن رو حساب میکنه

خب، حالا شما فرض کن دیفالت امتیاز رو 5 هست و نفرات رو 1 ، اولین نفر میاد امتیاز میده من میام امتیاز فعلی رو با امتیاز موجود قبلی جمع می کنم و تقسیم به تعداد نفرات +1 می کنم یعنی این فرمول :

امتیاز قبلی : oldrate  = 5
امتیاز وارد شده: userrate   = 4
تعداد نفرات : numrate+1  = 2

امتیاز جدید = (oldrate+userrate) تقسیم بر numrate+1 که مساوی 4.5 میشه

خب واسه کاربر اول مشکلی نداره و سیستم درست هست.
اما مثلا برای کاربر دهم ما امتیاز قبلی مون برابر میانگین اون 9 نفر قبلی هست و مثلا شده 4 ، حالا اگه یکی بیاد 5 بده و ما همین فرمول رو بخوایم اجرا کنیم میشه 5 تقسیم بر 10 که میشه 0.5 ،

سیستم درست برای سیستم های امتیاز دهی چی هست که بقیه هم استفاده می کنند ؟
من فرمولش رو پیدا کردم. این کد ها رو نوشتم اما ارور داره:

کد پی‌اچ‌پی:
int total = ((Integer.parseInt(rate) * Integer.parseInt(nrate) ) + Integer.parseInt(newrate)) / (Integer.parseInt(nrate) + 1);
                
db.update_rate("ashpazi"zirgorohnameString.valueOf(total));
            } 

این ارور ها رو دارم :

کد پی‌اچ‌پی:
04-02 11:29:15.073E/InputEventReceiver(25563): Exception dispatching input event.
04-02 11:29:15.073E/MessageQueue-JNI(25563): Exception in MessageQueue callbackhandleReceiveCallback
04
-02 11:29:15.097E/MessageQueue-JNI(25563): java.lang.NumberFormatExceptionInvalid int"2.0"
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.Integer.invalidInt(Integer.java:137)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.Integer.parse(Integer.java:374)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.Integer.parseInt(Integer.java:365)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.Integer.parseInt(Integer.java:331)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at com.banooyeparsi.srp.ashpazi.Etelaat_ashpazi$2.onRatingChanged(Etelaat_ashpazi.java:96)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.widget.RatingBar.dispatchRatingChange(RatingBar.java:315)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.widget.RatingBar.onStopTrackingTouch(RatingBar.java:303)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:404)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.View.dispatchTouchEvent(View.java:7782)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2145)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1577)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.app.Activity.dispatchTouchEvent(Activity.java:2505)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2093)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.View.dispatchPointerEvent(View.java:7973)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4384)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4255)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3927)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3984)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6116)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6096)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6050)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6246)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.os.MessageQueue.next(MessageQueue.java:138)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.os.Looper.loop(Looper.java:150)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at android.app.ActivityThread.main(ActivityThread.java:5333)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.reflect.Method.invokeNative(Native Method)
04-02 11:29:15.097E/MessageQueue-JNI(25563):     at java.lang.reflect.Method.invoke(Method.java:51
04
-02 11:29:15.153E/AndroidRuntime(25563): FATAL EXCEPTIONmain
04
-02 11:29:15.153E/AndroidRuntime(25563): Processcom.banooyeparsi.srpPID25563
04
-02 11:29:15.153E/AndroidRuntime(25563): java.lang.NumberFormatExceptionInvalid int"2.0"
04-02 11:29:15.153E/AndroidRuntime(25563):     at java.lang.Integer.invalidInt(Integer.java:137)
04-02 11:29:15.153E/AndroidRuntime(25563):     at java.lang.Integer.parse(Integer.java:374)
04-02 11:29:15.153E/AndroidRuntime(25563):     at java.lang.Integer.parseInt(Integer.java:365)
04-02 11:29:15.153E/AndroidRuntime(25563):     at java.lang.Integer.parseInt(Integer.java:331)
04-02 11:29:15.153E/AndroidRuntime(25563):     at com.banooyeparsi.srp.ashpazi.Etelaat_ashpazi$2.onRatingChanged(Etelaat_ashpazi.java:96)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.widget.RatingBar.dispatchRatingChange(RatingBar.java:315)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.widget.RatingBar.onStopTrackingTouch(RatingBar.java:303)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:404)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.View.dispatchTouchEvent(View.java:7782)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2322)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2027)
04-02 11:29:15.153E/AndroidRuntime(25563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2145)
04-02 11:29:15.153E/AndroidRuntime(25563):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1577)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.app.Activity.dispatchTouchEvent(Activity.java:2505)
04-02 11:29:15.153E/AndroidRuntime(25563):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2093)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.View.dispatchPointerEvent(View.java:7973)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4384)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4255)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3927)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3984)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3851)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3820)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3828)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3801)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6116)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6096)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6050)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6246)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.os.MessageQueue.nativePollOnce(Native Method)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.os.MessageQueue.next(MessageQueue.java:138)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.os.Looper.loop(Looper.java:150)
04-02 11:29:15.153E/AndroidRuntime(25563):     at android.app.ActivityThread.main(ActivityThread.java:5333)
04-02 11:29:15.153E/AndroidRuntime(25563):     at java.lang.reflect.Method.invokeNative(Nat 

 
به float تغییر دادم درست شد
سلام.
مهمترین چیز در سیستم امتیازدهی سمت سرور، این است که کاربران نتوانند دو یا چند بار امتیاز بدهند. بنابراین ما باید یک جدول داشته باشیم که یک ستون آن برابر یک مشخصه منحصر بفرد از گوشی کاربر (شماره سریال گوشی) و ستون دیگری، برابر امتیازی که وی داده است باشد. پس وقتی نظری را در پایگاه داده ثبت می کنیم، باید شماره سریال گوشی را چک کنیم که تکراری نباشد. 
این جدول را که داشته باشیم، می توانیم معتبر بودن امتیاز جدید (که کاربر قبلا امتیاز نداده باشد) را چک کنیم. یک جدول هم برای نتیجه نهایی می گذاریم، یعنی با ثبت یک امتیاز جدید، نتیجه کلی امتیازها را در همان زمان در این جدول دوم قرار می دهیم. اینگونه، هر بار در نمایش امتیاز، نیازی نیست که شمارشی بر اساس جدول اول داشته باشم.
برای به دست آوردن شماره سریال گوشی، کلید زیر را بخوانید :

کلید شماره 2974


 
برای راحتی کار میتونید برنامه نویسی سمت سرور رو با php انجام بدین و مقادیر رو بهش با POST ارسال کنید ...
اونطرف توسط PHP دریافت و روی دیتابیس اعمال کنید ...
البته کد رندوم Admin هم یه راه عالی برای جلوگیری از تکرار هستش، کلا مباحث امنیتی پیچیده هستش .