• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

com.jkelany

الخبراء المعتمدون
  • عدد المشاركات

    4,272
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة com.jkelany

  1. بسم الله الرحمن الرحيم اود ان اقدم لكم درسا قد سال عنه الجميع فى منتدانا الحبيب وهناك الكثير من الاستفسارات عن هذا المووضوع الا وهو كيفيه ربط قواعد البيانات باستخدام MySQL مع لغه الجافا ناتى الى مرحلتين الا وهى كيفيه عمل قاعده بيانات مبسطه مكونه من جدول واحد باستخدام MySQL ثم كيفيه الربط مع اللغه الغاليه الجافا تابع معى الشرح المدعم بالصور ناتى الى البدايه ان نقوم بتسطيب برنامج MySQL والـ GUI tools الخاصه به " لم انشاء له شرح " يمكنك البحث وان لم تستطع ممكن نشرح تسطيبه ان شاء الله بعد ذلك نذهب ونفتح البرنامج وبعد ان نضغط على MySQL Adminstartor فانه يتم فتح البرنامج واظاهر الشاشه التاليه التى تطلب منك ادخال server host اللتى دائما ما نكتب فيها localhost ورقم الـ port اذا لم تقم بتغيره فهو الثابت فى البرنامج 3306 اما اذا قمت بتغيره فضع الرقم الجديد ويطلب منك اسم المستخدم والرقم السرى الخاص به بعد ان يتاكد البرنامج من البيانات المدخله له يتم ظهور الشاشه التاليه ما يهمنا الان هو انشاء قواعد بيانات جديده ليس باقى الاشياء انظر الى الصوره واتبع التعليمات الموضحه عليها بعد ذلك يطلب منك ادخال اسم قاعده البيانات وبعد ذلك ناتى الى مرحله ادراج جدول بيانات فى هذه القاعده انظر الى الصوره التاليه وبعدها ناتى الى ادخال اسم الجدول والبيانات الخاصه بالاعمده والوصف لها موضحه فى الصوره التاليه وبعد ان تقوم بكتابه الاعمده واسم الجدول تضغظ على Apply changes اللتى تعرض لك امر انشاء الجدول وتاكد عليك هل هذا ما تريد انشاءه بالفعل ؟ وبعد ان يتم عمل قاعده البيانات نلاحظ انها فارغه فنقوم بوضع بعض البيانات فى هذه القاعده يدويا حتى اذا ما طلبنا منها بيانات قبل ادارج البيانات بها تقوم بارجاع بيانات لاحظ معى التالى نقوم بادراج البيانات فى الجدول الخاص بهذه القاعده ولكن عندما تظهر لنا الصفحه الخاصه بالتعديل لابد من تنشيط الامر Edit كما هو موضح بالصوره وناتى بعد ذلك لادراج البيانات وبعد ادراج 4 صفوف نجدها بالشكل التالى وقبل ان ننتهى فى اخر الصفحه نجد امر apply changes نقوم بالضغط عليه لكى يتم حفظ البيانات اللتى تم ادخالها وهكذا تم انشاء قاعده بيانات MySQL المره القادمه ان شاء الله سوف اعرض لكم كيفيه الربط وكيفيه تنفيذ الاوامر مثل select * from table insert into table delete recorde انتظرونا ان شاء الله لو لم يكون كابوس الامتحانات لكنت اكملت الصور موجوده صنعتها بالامس لكن تحتاج الى شرح فقط اتمنى ان اكون اخذت جانب هام لملاحظتى ان الكثيرين لديهم هذه المشكله استودعكم الله
  2. JKelanyChat برنامج دردشة بالجافا

    هذا كان شرح للفكره لكن الاكواد لايوجد شرح لها الشرح بالتوفيق 
  3. السلام عليكم ورحمه الله وبركاته كيفيكم يا احباب هذا المنتدى احب ان اشارككم اليوم ببرنامج شات TCP البرنامج شكله مقتبس من الياهو لكنه من تصميمى الخاص البرنامج به العديد من الاشياء التى ممكن الاستفاده منها المشروع عباره عن Client , server and Web server سوف اقوم بارفاق الملفات الخاصه بهذا المشروع وسوف اقوم ايضا بارفاق الـ Presentation الخاصه بالمشروع اتمنى ان اجد نقدكم فى المشروع لمزيد من التقدم باذن الله لتحميل الملفات JKelanyChat.rar Jkelany Chat Project Presentation.rar
  4. التعرف على لغة الموقع

    السلام عليكم هذا ممكن يفيدك باذن الله https://builtwith.com وشكرا
  5. ارسال رسائل SMS مجانا

    لايوجد ذلك بالمجان اذا تستخدم من رصيد جوالك او تستخدم من رصيد مواقع تقدم مجموعه من الرسايل باسعار معينه حسب خطط الاسعار لكن بالمجان لايوجد
  6. معظم المواقع التي تستضيف قاعده البيانات والPhp هناك الكثير منها مجاني وايضا مدفوع ممكن تستخدم موقع مثل www.eb2a.com فهو يقدم استضافه مدفوعه ومجانيه ايضا   يمكنك مشاهده هذه الروابط كيفية الحصول على البيانات من ملف الـ XML فى الاندرويد كيفية الحصول على البيانات عن طريق الـ JSON فى الاندرويد
  7. هناك مشكله في هذا الاصدار من مطوري الSDK
  8. انا جديد فى لغه الاندرويد وعاوز اشياء تساعدنى

    الاكليبس مع الاندرويد http://developer.android.com http://developer.android.com/preview/setup-sdk.html   كتب https://www.mediafire.com/folder/f6acnmg01vfpt/Android   فيديوهات باللغه الانجليزيه https://buckysroom.org/videos.php?cat=6
  9. وعليكم السلام القاعده لا تحمل ضمن البرنامج علي الاندرويد ولكن ترفع قاعده البيانات علي موقع استضافه ويتم الربط بينهما باستخدام Reset API وممكن تستخدم في الربط JSON or XML
  10. هناك مشكله فالاصدار 20 وليس مشكله فكود الاندرويد نفسه وبالدليل انه بيشتغل علي المحاكي  
  11. السلام عليكم ورحمه الله وبركاته اتمنى ان تكونوا بخير ان شاء الله اليوم سوف نقوم بشرح كيفية عمل متصفح بسيط ليس الفكرة هى عمل متصفح وان يحتوى على جميع المكونات والخصائص وخلافه لكن الفكره نفسها تكمن فى كيفية التعامل مع ذلك مع التعلم اشياء جديده سوف نقوم ببناء هذا المتصفح البسيط وهو عباره عن مكان لوضع رابط الموقع وزرار للذهاب للموقع ومكان WebView لعرض الصفحه التى تم استرجاعها من الموقع مع امكانيه التقدم للامام او الرجوع للخلف ان كان ذلك يسمح او حذف تاريخ المواقع التى تصفحتها او اعادة تحميل الصفحه فقد قومت ببناء هذ االشكل البسيط فهو عباره عن الجزء العلوى الخاص بالرابط والجزء السفلى الخاص بالـ WebView التى يتم عرض بها الموقع كما بالصوره وفى اسفل الصوره القائمه menu الخاصه بالتطبيق تم جعلها على شكل menu كى يتم اعطاء مساحه اكبر للصفحه وهذا هو الكود الخاص بالـ layout web_browser.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/et_url" android:layout_width="fill_parent" android:lines="1" android:focusable="true" android:focusableInTouchMode="true" android:inputType="text|textEmailAddress" android:layout_height="wrap_content" /> <Button android:text="@string/btn_go" android:layout_width="wrap_content" android:layout_alignRight="@id/et_url" android:id="@+id/btn_go" android:layout_height="wrap_content"/> </RelativeLayout> <WebView android:id="@+id/wv_browser" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> لا شىء جديد فى موضوع الـ layout فهو اسهل شىء يمكن القيام به بعد محاولات لنتظيم الشكل بعد ذلك قومنا بعمل Activity يتعامل مع هذا الـ layout وكما تعودنا فى المرات السابقه وهو ان نقوم بعمل مرجعيه للربط بين كود الجافا وكود الـ XML بعد ذلك نريد ان نقوم بعرض صفحه موقع وليكن www.google.com كيف للمتصفح ان يقوم بفتح هذه الصفحه ؟؟؟ لدينا من قبل مرجعيه للـ WebView browserWebView = (WebView) findViewById(R.id.wv_browser); حيث نقوم بعدها بمناداه الداله loadUrl ونعطيها رابط الموقع ولكن لابد وان يكون رابط الموقع يبدا بـ http:// او https:// لكى يعمل بطريقه صحيحه لتجربه عرض موقع جوجل يكون كالتالى browserWebView.loadUrl("http://www.google.com"); فلذلك قومنا بعمل داله تقوم بفحص ذلك if (url.startsWith("http://www") || url.startsWith("http://") || url.startsWith("https://www") || url.startsWith("https://")) { } else if (url.startsWith("www")) { url = "http://" + url; } else { url = "http://www." + url; } هل انتهى الى هنا كل شىء ؟ لا هناك مشكله قد تظهر مع المواقع التى تتعامل مع الجافا اسكريبت فلابد من ان نقوم بطلب من المتصفح الخاص بنا بتفعيل خاصه الـ JavaScript لكى نقوم بالتعامل مع الخصائص الخاصه بالمتصفح فنقوم باستدعاء الداله getSettings على المتصفح WebSettings setting = browserWebView.getSettings(); ومن ثم تعود الينا بالخصائص WebSettings نقوم بعدها بتفعيل الجافا اسكريبت setting.setJavaScriptEnabled(true); لكن هناك ايضا مشكله من حيث الشكل فعند تحميل الموقع يتم تحميله بالشكل الطبيعى ممكن يجعلك تقوم بتحريك الشاشه باصبعيك لكى تصل الى المكان المطلوب فالصفحه فهذا امر صعب ومتعب فى نفس الوقت فهناك حل ان نقوم بعرض الصفحه بشكل كامل ومن ثم اذا اردت الوصول يمكنك بعد ذلك التكبير لكى نقوم بتفعيل امر العرض الكامل فهو ايضا موجود ضمن الـ settings setting.setLoadWithOverviewMode(true); setting.setUseWideViewPort(true); ماذا عن كيفيه التكبير ؟؟؟ فهى ايضا خاصيه يجب عليك تفعيلها يدويا setting.setSupportZoom(true); نجد فى المتصفح الخاص بالـ Android ان هناك زرار تكبير وتصغير فيمكنك ايضا تفعيلهم عن طريق setting.setBuiltInZoomControls(true); ها قد انتهينا من تفعيل الخصائص المطلوبه فى المتصفح ماذا عن التقدم للامام Forward والرجوع للخلف Backward وحذف المواقع التى تم زيارتها Clear History او اعادة تحميل الصفحه Refresh الامر بسيط جدا بالنسبه لاعاده تحميل الصفحه Refresh ماعليك الا استدعاء الداله reload على الكائن من نوع WebView browserWebView.reload(); ايضا بالنسبه لحذف الموقع Clear History كل ما عليك استدعاء الداله clearHistory على الكائن من نوع WebView browserWebView.clearHistory(); بالنسبه ايضا للـBackward فهى تعمل بنفس الكيفية وهو مناداه الداله goBack لكن لابد عليك اولا من التحقق هل هناك امكانيه من الرجوع الى الخلف ؟؟ فربما يكون هذا اول موقع لديك فى المتصفح فبالتالى الرجوع للخلف ليس هناك اى معلومات فتتأكد من خلال الداله canGoBack if (browserWebView.canGoBack()) { browserWebView.goBack(); } وبالنسبه للـ Forward فهى تعمل بنفس طريقة الـ Backward if (browserWebView.canGoForward()) { browserWebView.goForward(); } هناك ايضا مشكله وهى تعد مشكله هامه جدا وحلها ابسط ما يكون وهى الاستماع للروابط داخل الموقع اذا فتحنا موقع جوجل فيكون بداخله روابط كيف يتم التقاط هذه الروابط وفتحها عن طريق المتصفح الخاص بك وليس متصفح المحمول اذا لم تقم بذلك فعند الضغط على اى رابط داخل الموقع فانه يتم نقلك اتوماتيكيا للمتصفح الرئيسى بالمحمول ولكن هذا لم يجعل المتصفح الخاص بى نافعا سوى فى فتح الصفحات التى اعطيه الرابط الخاص بها من خلال المكان المخصص له بالاعلى لى تقوم بحل المشكله لابد من مناداه الداله setWebViewClient وهى تقوم باخذ كائن يكون مورثاً من WebViewClient لكى تتمكن من التقاط الروابط بداخل الصفحه browserWebView.setWebViewClient(new SimpleWebViewClient()); لذلك قومنا ببناء SimpleWebViewClient class لكى نقوم بعمل Override للروابط التى يضغط عليها المستخدم لكى يتم توجيهها للمتصفح الخاص بى وليس المتصفح الرئيسى للمحمول وعمل اعادة كتابه للداله shouldOverrideUrlLoading التى بداخلها نقوم بعمل توجيه مره اخرى للمتصفح الخاص بى وليس المتصفح الرئيسى public class SimpleWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } وبذلك تم حل هذه المشكلة ما بعد ذلك ما هو الا اشياء جماليه فى الشكل والتعامل مثلا عند فتح المتصفح وكتابه الرابط والضغط على زر Go فان لوحه المفاتيح تظل كما هى لا يتم اغلاقها فنحن نريد ان نغلقها بعد ان نقوم بالضغط على زر Go لذلك قومنا بعمل الداله التاليه private void hideKeyboard() { InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(urlEditText.getWindowToken(), 0); } وهى ما نقوم بالحصول على مدير الادخال بالجهاز ومن ثم تقوم باخفاء وسيلة الادخال من الشاشه على المتغير EditText مشكله اخرى عندما نقوم بكتابه العنوان فالمتصفح نجد ان مؤشر الكتابه يكون دائما موجود فمكان كتابه العنوان وعند تحميل صفحه مثل جوجل ونريد الكتابه فى مربع البحث فان المؤشر ينتقل بداخل مربع البحث ولكن لا تظهر لوحه المفاتيح المشكله ليست فى اننا قد اخفينا لوحه المفاتيح المشكله انه يوجد مؤشر فى مكان كتابه العنوان ومؤشر اخر داخل مكان مربع البحث فى الموقع فلابد من نقل عمليه التركيذ Focus من مكان العنوان الى الـWebView وذلك عن طريق الكود التالى browserWebView.requestFocus(); وبذلك تم حل المشكله نذهب لمشكله اخرى وهى انه عند الضغط على اى عنوان بداخل الصفحه يبقى العنوان الذى تم ادخاله فى اول مره ولن يتغير فالـ EditText ولكن يتم ارسال الرابط الجديد داخليا ويتم عرض الصفحه الجديده لكن نريد ان نقوم بتغيير العنوان ايضا فبداخل الداله shouldOverrideUrlLoading قومنا بعمليه تغيير العنوان urlEditText.setText(url); تبقى نفس المشكله فى حاله عمليه الرجوع للخلف او التقدم للامام عند الضغط على Forward او Backward يقوم المتصفح بعرض الصفحه السابقه او التاليه ولكن رابط الصفحه لن يتغير فى هذه الحاله علينا الحصول على القائمه التى تحتوى على المواقع التى تم تصفحها لكى يتم الحصول على رابط الموقع المطلوب وذلك من الداله copyBackForwardList WebBackForwardList mWebBackForwardList = browserWebView.copyBackForwardList(); بعد ذلك يمكننا الحصول على الرابط الخاص بذلك String historyUrl = mWebBackForwardList.getItemAtIndex(mWebBackForwardList.getCurrentIndex() + i).getUrl(); عن طريق تغيير القيمه i لتكون = 0 يعنى انك تريد الرابط الحالى المعروض لديه الصفحه فى الـ WebView لكن ان كان i = 1 فانت تريد الموقع التالى Forward او ان كان i = -1 فان تريد الموقع السابق Backward ومن ثم نقوم بعدها بتتغير رابط الموقع فالـ EditText هناك خطأ ممكن ان يقع به المستخدم انه فى حاله الضغط على زر الرجوع فى الموبيل فانه يتم اخراجه من التطبيق على النقيض انه يعتقد انه سوف يقوم بارجاعه للموقع السابق فقد تم التعامل مع ذلك عن طريق اعاده تعريف الداله finish @Override public void finish() { if (browserWebView != null) { if (browserWebView.canGoBack()) { browserWebView.goBack(); updateUrlEditText(BROWSER_ACTIONS.BACKWORD.getId()); return; } } super.finish(); } يتبقى شىء وهو اضافه لتعلم شىء جديد وهو حفظ اخر رابط تم وضعه بالمتصفح وعندما يتم تشغيل المتصفح مره اخرى يتم تحميل الرابط وبدا الصفحه من جديد وذلك كما ذكرنا من قبل فى الدرس السابق ممكن ذلك عن طريق قواعد البيانات او عن طريق الـ Preferences وهذه الطريقه سوف نقوم بعملها عن طريق الـ Preferences لكن دون الاحتياج لبناء XML لكى اتعامل معه لان عمليه حفظ البيانات سوف يتم ضمنياً كل ما علينا فعله هو كما شرحنا مسبقا فالدرس السابق private SharedPreferences sharedPreferences; private final String FILE_NAME = "JKWebbrowserSettings"; private final String DEFAULT_URL = "http://www.google.com"; private final String URL_KEY = "LAST_URL"; sharedPreferences = getSharedPreferences(FILE_NAME, 0); عندنا نريد تخزين بيانات فالـ SharedPreferences نقوم بعمل edit لـ SharedPreferences وبعد ذلك نقوم بوضع القيم التى نريد تخزينها عن طريق الداله putString على سبيل المثال التى تأخذKey و Value وبعدها نقوم بعمليه الـ commit لحفظ البيانات بداخلها sharedPreferences.edit().putString(URL_KEY, url).commit(); ولكى نحصل على البيانات من داخل الـ SharedPreferences String url = sharedPreferences.getString(URL_KEY, DEFAULT_URL); ونقوم باعطاء قيمه اساسية فى حاله عدم وجود الرابط فى الـ SharedPreferences لان ذلك سوف يحدث فى المره الاولى لاستخدام التطبيق يبقى اعطاء التطبيق الاذن بالدخول على الانترنت فى ملف الـ AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" /> لتحميل الكود :) JKelany Webbrowser.zip بالتوفيق ان شاء الله
  12. السلام عليكم ورحمه الله وبركاته كنت أريد ان اعرف كيف اذا كنت اعمل على برنامج يعمل على الانترنت واريد فى حاله انقطاع الانترنت ان اقوم بالاستماع له واظهر رساله للمستخدم تفيد ان الاتصال قطع ولا يمكنه استخدام البرنامج هذا الموضوع كان هيكون سوال لى على المنتدى ولكن فى اللحظات الاخيره بعد بحث طويل من فتره شهر لكنى تناسيت الموضوع بسبب الامتحانات قولت اغير كلمات التى ابحث بها فى هذا الموضووع وتوصلت للحل والحمدلله   private boolean isInternetConnection() throws SocketException { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface interf = interfaces.nextElement(); if (interf.isUp() && !interf.isLoopback()) { return true; } } return false; } يمكن يفيد احد فى احد برامجه وهو انك تقوم بالبحث عن جميع الـ NetworkInterface الموجوده لديك سواء Wireless , Cable , Modem وتقوم بفحص عمليه الـ loopback , isUp إذا كان هذا ال Interface ليس ال loopback interface (و هو interface وهمى موجود في كل نظام تشغيل و عادة ما يكون عنوانه 127.0.0.1) وايضا يكون isUp يعنى موجود وشغال فان لديك Internet Connection وبالتالى تقوم بفحص وجود انترنت ام لا بالتوفيق ان شاء الله
  13. السلام عليكم ورحمه الله وبركاته ان شاء الله اليوم هنشرح مع بعض كيفيه التعامل مع قواعد البيانات SQLite مع الاندرويد حيث انها قاعده البيانات التى توجد على الموبيل Android لكن يمكن التعامل مع قواعد البيانات الاخرى مثل الـ MySQL ولكن يكون ذلك على remote server ويتم التعامل معاها عن طريق الـ Webservices لكى يتم التعامل مع قواعد البيانات فهناك فئه تدعم ذلك وهى SQLiteOpenHelper وهى من تمكننا من التعامل مع قواعد البيانات بكل سهوله ويسر نقوم بالوراثه من هذه الفئة فيكون لدينا دالتين onCreate التى تستدعى فى حاله انشاء قاعده البيانات لاول مره وداله onUpgrade التى تستدعى فى حين عمل تحديثات وهى عاده ما يقوم فيها باسقاط الجداول وتكوينها من جديد سوف نقوم فى شرحنا ببناء جدول مكون من الاعمدة ID , NAME , AGE وهو جدول بسيط جدا لكى يتم تسهيل عمليه الشرح قومنا بحفظ اسماء الاعمدة واسم الجدول وقاعده البيانات فى متغيرات لكى يسهل استخدامهم مره اخرى فى اى مكان فالكود هكذا private String KEY_ID = "ID"; private String KEY_NAME = "NAME"; private String KEY_AGE = "AGE"; private static String DB_NAME = "SQLTEST"; private String DB_TABLE_NAME = "myTable"; private static int DB_VERSION = 1; فى داله الـ onCreate نقوم باستخدام المتغير db الموجود من ضمن احد مدخلاتها ونقوم باستدعاء الداله execSQL وهى من تقوم بعمل تنفيذ لامر خاص بقواعد البيانات ونقوم بكتابه الامر الخاص ببناء الجدول @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + DB_TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , " + KEY_NAME + " TEXT ," + KEY_AGE + " INTEGER );"); } ولكن فى الداله onUpgrade نقوم كما قولنا فالسابق باسقاط الجدول الذى تم انشاءه من الداله onCreate واعاده انشائه مره اخرى عن طريق استدعاء الداله onCreate من داخل الداله onUpgrade لاعادة الانشاء @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_NAME); onCreate(db); } وبهذا يكون قد تم ان شاء الجدول لكن لم نتكلم عن كيفيه انشاء قاعده البيانات نفسها فهل هذا الجدول بمفرده هكذا فى الهواء الطلق ؟؟؟ الاجابه : لا لان فى البناء الخاص بالفئه التى نتعامل معاها نقوم باستدعاء الـ super ونقوم باعطائه اسم القاعده ورقم اصدارها super(context, DB_NAME, null, DB_VERSION); وبهذا نكون قد انشأنا قاعده البيانات والجدول لكن كيفيه عمل ادراج او تعديل او حذف على قاعده البيانات لعمل ذلك هناك دالتين فى الفئه SQLiteOpenHelper getReadableDatabase وهى من تقوم بجعل قاعده البيانات للقرائه فقط لكننا نحتاجها للتعديل والاضافه فلذلك سوف نستخدم الداله getWritableDatabase والتى تعود لنا بكائن من الفئة SQLiteDatabase SQLiteDatabase database = getWritableDatabase(); فى هذا المثال قومنا باستخدام الـ MVC design pattern وهو ان تقوم بعمل bean class تمثل الجدول الموجود فى قاعده البيانات لان عندنا نقوم بعمل استدعاء لكل الصفوف فى قاعده البيانات فكل كائن من النوع Info يمثل صف فى قاعدة البيانات public class Info { private int id; private String name; private int age; public Info() { } public Info(String name, int age) { this.name = name; this.age = age; } public Info(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } لكى نقوم باستدعاء (select) جميع الصفوف الموجوده فى قاعده البيانات قومنا بانشاء داله تقوم بذلك وتعود الينا بمصفوفه من النوع Info تمثل جميع الصفوف فى قاعده البيانات public Info[] selectAll() { String columns[] = new String[] { KEY_ID, KEY_NAME, KEY_AGE }; Cursor c = database.query(DB_TABLE_NAME, columns, null, null, null, null, null); int idIndex = c.getColumnIndex(KEY_ID); int nameIndex = c.getColumnIndex(KEY_NAME); int ageIndex = c.getColumnIndex(KEY_AGE); List<Info> list = new ArrayList<Info>(); if (c.moveToFirst()) { do { list.add(new Info(c.getInt(idIndex), c.getString(nameIndex), c .getInt(ageIndex))); } while (c.moveToNext()); } return list.toArray(new Info[list.size()]); } لكى نقوم بتنفيذ الاستدعاء نقوم باستدعاء الداله query على الـdatabase ونقوم باعطائها اسم الجدول ومصفوفه من اسماء الاعمدة التى تريد ان تقوم باحضارها وليس هناك اى شروط او ترتيب او اى شىء اخر فجميع القيم تكون عباره عن null تعود لنا النتيجه فى كائن من الفئة Cursor لكى نحصل على البيانات من الـ Cursor لابد وان نعمل ترتيب اسم العمود فى قاعده البيانات لكن هناك وسيلة افضل ان نقوم بالحصول على رقم العمود من اسمه هكذا int idIndex = c.getColumnIndex(KEY_ID); int nameIndex = c.getColumnIndex(KEY_NAME); int ageIndex = c.getColumnIndex(KEY_AGE); ونقوم ببناء قائمه من الـ Info لاننا لا نعلم كم عدد الصفوف فى قاعده البيانات نقوم بعمل لووب على البيانات نقوم بتفحص البيانات والذهاب لاول صف واخد البيانات منه وبعد ذلك التحرك للامام فأفضل طريقه للتعامل مع ذلك هو الـ do...while loop وبداخل اللوب نقوم باخد البيانات عن طريق نوعها getXXX هناك جميع الانواع المتاحه مع قاعده البيانات وباستخدام رقم العمود التى تم الحصول عليه من قبل ونكون كائن من نوع Info ونضعه فى الـ list حتى تنتهى اللوب ونقوم بتحويل الـ list الى Array وذلك حصلنا على جميع البيانات وسوف نقوم بشرح كيفيه عرض هذه البيانات الموجوده فى المصفوفه ان شاء الله الداله selectOne وهى من تجلب صف من قاعده البيانات بناء على شرط معين public Info selectOne(int id) { String columns[] = new String[] { KEY_ID, KEY_NAME, KEY_AGE }; Cursor c = database.query(DB_TABLE_NAME, columns, KEY_ID + " = " + id, null, null, null, null); int idIndex = c.getColumnIndex(KEY_ID); int nameIndex = c.getColumnIndex(KEY_NAME); int ageIndex = c.getColumnIndex(KEY_AGE); if (c != null && c.moveToFirst()) { return new Info(c.getInt(idIndex), c.getString(nameIndex), c.getInt(ageIndex)); } return null; } هى نفس الـ SelectAll ولكن الجديد هو الشرط فهناك المدخل الثالث للداله query قومنا بوضع الشرط KEY_ID + " = " + id وهو مخصص لشرط جلب البيانات نأتى بعد ذلك لعمليه ادراج البيانات (insert) ولذلك قومت ببناء داله تأخذ كائن من الـ Info وتقوم بوضع بياناته فى قاعده البيانات public long insert(Info info) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, info.getName()); cv.put(KEY_AGE, info.getAge()); return database.insert(DB_TABLE_NAME, null, cv); } لكن لوضع البيانات فى قاعده البيانات نقوم باستدعاء الداله insert التى تأخد اسم الجدول وهل يسمح باضافه صف فى قاعده البيانات اذا كانت محتوياته تحتوى على null فنحن لا نريد ذلك فلذلك وضعنا القيمه الافتراضيه null والمدخل الاخير يأخذ كائن من النوع ContentValues وهو ما يشبة كثير بالـ Hashmap نقوم بعملها وتسكين المتغيرات بداخلها , المفتاح والقيمه وبعدها نقوم بعمليه ادراج البيانات الداله update تشبه كثيرا الداله insert لكنها لديها اختلاف بسيط هو شرط التعديل public long update(Info info) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, info.getName()); cv.put(KEY_AGE, info.getAge()); return database.update(DB_TABLE_NAME, cv, KEY_ID + " = " + info.getId(), null); } فهى تأخذ اسم الجدول والقيم المعدلة وشرط التعديل where ومتتغيرات او مدخلات جمله الشرط التعديل ولكن عادة ما نكتب الشرط كاملا ولا نحتاج للمتغيرات فنضعها بـ null وللداله الخاصه بالحدف delete وهنا يكون الحذف عن طريق المفتاح الاساسى Primary Key public long delete(int id) { return database.delete(DB_TABLE_NAME, KEY_ID + " = " + id, null); } نستخدم الداله delete ومن مدخلاتها اسم الجدول والشرط ومتغيرات الشرط وبهذا نقوم قد شرحنا كيفيه التعامل مع قواعد البيانات وشرح كتابه الخمس دوال الاساسية التى يحتاجها اى جدول فى قاعده البيانات من (selectAll , selectOne , insert , update , delete) وهذا الكود كاملا لما سبق package com.jkelany.sql; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class InfoServices extends SQLiteOpenHelper { private String KEY_ID = "ID"; private String KEY_NAME = "NAME"; private String KEY_AGE = "AGE"; private static String DB_NAME = "SQLTEST"; private String DB_TABLE_NAME = "myTable"; private static int DB_VERSION = 1; private SQLiteDatabase database; public InfoServices(Context context) { super(context, DB_NAME, null, DB_VERSION); database = getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + DB_TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT , " + KEY_NAME + " TEXT ," + KEY_AGE + " INTEGER );"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_NAME); onCreate(db); } public Info[] selectAll() { String columns[] = new String[] { KEY_ID, KEY_NAME, KEY_AGE }; Cursor c = database.query(DB_TABLE_NAME, columns, null, null,null,null,null); int idIndex = c.getColumnIndex(KEY_ID); int nameIndex = c.getColumnIndex(KEY_NAME); int ageIndex = c.getColumnIndex(KEY_AGE); List<Info> list = new ArrayList<Info>(); if (c.moveToFirst()) { do { list.add(new Info(c.getInt(idIndex), c.getString(nameIndex), c .getInt(ageIndex))); } while (c.moveToNext()); } return list.toArray(new Info[list.size()]); } public Info selectOne(int id) { String columns[] = new String[] { KEY_ID, KEY_NAME, KEY_AGE }; Cursor c = database.query(DB_TABLE_NAME, columns, KEY_ID + " = " + id, null, null, null, null); int idIndex = c.getColumnIndex(KEY_ID); int nameIndex = c.getColumnIndex(KEY_NAME); int ageIndex = c.getColumnIndex(KEY_AGE); if (c != null && c.moveToFirst()) { return new Info(c.getInt(idIndex), c.getString(nameIndex), c.getInt(ageIndex)); } return null; } public long insert(Info info) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, info.getName()); cv.put(KEY_AGE, info.getAge()); return database.insert(DB_TABLE_NAME, null, cv); } public long update(Info info) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, info.getName()); cv.put(KEY_AGE, info.getAge()); return database.update(DB_TABLE_NAME, cv, KEY_ID + " = " + info.getId(), null); } public long delete(int id) { return database.delete(DB_TABLE_NAME, KEY_ID + " = " + id, null); } } يبقى فقط عملية العرض وهى من المفترض ان يكون المبرمج على درايه بها لكن لا بأس من عرض كيفيه استخدام ذلك حيث ان ممكن ان يكون نظام الـ MVC جديد على بعض الناس فلدينا الفئة InfoServices وهى ما تقوم بالتعامل مع قاعده البيانات و هى ما نتكلم عليها طول شرحنا والفئة Info وهى من تحمل البيانات والان سوف نقوم باستخدامهم فى الـTestSQLHelperActivity package com.jkelany.sqlhelper; import com.jkelany.sql.Info; import com.jkelany.sql.InfoServices; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class TestSQLHelperActivity extends Activity { private InfoServices infoServices; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.tv_sql_rs); infoServices = new InfoServices(this); // insert infoServices.insert(new Info("Mahmoud Kelany", 21)); // select one Info info = infoServices.selectOne(1); info.setAge(22); // update infoServices.update(info); // select all Info[] rs = infoServices.selectAll(); String result = ""; for (int i = 0; i < rs.length; i++) { result += rs[i].getId() + " - " + rs[i].getName() + "(" + rs[i].getAge() + ")\n"; } tv.setText(result); // delete id = 1 infoServices.delete(1); infoServices.close(); } } فهناك لكل داله جزء خاص بها للتعامل معها اعتقد انه بسيط جدا على ان يتم شرحه ولاى استفسار انا موجود ان شاء الله لتحميل المشروع TestSQLHelper.zip بالتوفيق ان شاء الله
  14. السلام عليكم ورحمه الله وبركاته ان شاء الله سوف اقوم بشرح كيفيه التعامل مع البيانات التى على شكل JSON وهى شكل متفق عليه مثل الـ XML ولكنه يختلف قليلا ويستخدم لنقل البيانات وهو ما يتعامل به الفيس بوك والتويتر (وهو مثالنا اليوم) مثال على التويتر https://api.twitter.com/1/statuses/user_timeline.json?screen_name=jkelanycompany مثال على الفيس بوك https://graph.facebook.com/jkelanydeveloper هذا هو شكل الـ JSON data عباره عن Array او Object او الدمج بينها والصوره توضح ايهما array وهو عباره ان اقواس مربعه [ ] والـ object وهو عبارة عن اقواس عادية { } كالعادة نحب ان نكون منظمين فقومت بعمل UserTweets bean package com.jkelany.json; public class UserTweets { private String text; private String date; private String userName; private String screenName; public UserTweets() { } public UserTweets(String text, String date, String userName, String screenName) { super(); this.text = text; this.date = date; this.userName = userName; this.screenName = screenName; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getScreenName() { return screenName; } public void setScreenName(String screenName) { this.screenName = screenName; } @Override public String toString() { return screenName + "(" + userName + ") @ " + date + "\n" + text + "\n"; } } حتى نتمكن من التعامل مع البيانات بشكل منظم قومت بتعريف متغيرين احدهما لاسم المستخدم والاخر لرابط الموقع والمثال لدينا على التوتير private String username = "jkelanycompany"; private final String TWITTER_API_URL = "https://api.twitter.com/1/statuses/user_timeline.json?"; لكى نحصل على البيانات عن طريق الـ JSON قومنا ببناء داله تقوم بذلك public JSONArray getUserTwittes(String username) throws ClientProtocolException, IOException, JSONException { StringBuilder sb = new StringBuilder(TWITTER_API_URL); sb.append("screen_name="); sb.append(username); HttpGet httpGet = new HttpGet(sb.toString()); HttpResponse httpResponse = httpClient.execute(httpGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == 200) { HttpEntity httpEntity = httpResponse.getEntity(); String jsonData = EntityUtils.toString(httpEntity); return new JSONArray(jsonData); } return null; } سوف نشرحها حالا فقد قومنا باضافه الكلمة screen_name= على الـ URL وبعدها اسم المستخدم ليكون الشكل النهائى للرابط كما ذكرنا من قبل StringBuilder sb = new StringBuilder(TWITTER_API_URL); sb.append("screen_name="); sb.append(username); لكن بناء داله ووضعها بهذا الشكل لكى نتمكن بعد ذلك بارسال فقط اى اسم مستخدم لهذه الداله نقوم بجلب التدوينات الخاصه بيه ع التويتر بعدها نقوم بانشاء كائن من الـ HttpGet ونقوم بارسال العنوان كاملا لها لكى تجلب البيانات من هذا العنوان HttpGet httpGet = new HttpGet(sb.toString()); ثم نقوم بانشاء كائن من الـHttpClient لكى نتعامل مع البرتوكول HTTP وننفذ جلب البيانات عن طريق استدعاء الداله execute على هذا الكائن وتعود لنا بالـHttpResponse HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpGet); من الـ HttpResponse نحصل على كود الحاله هل هو مساوى لـ 200 وهو يعنى ان العمليه تمت بنجاح اذا كانت 200 فمعنى ذلك ان الـ HttpResponse تحتوى على البيانات من الرابط ويمكن الحصول عليها باستدعاء الداله getEntity على الـhttpResponse وهى ما تعود لنا بكائن من الـHttpEntity ومن ثم نريد تحويل هذا الكائن من النوع HttpEntity الى String نستخدم الداله EntityUtils.toString لعمل ذلك وبعد ذلك نقوم بارسال قيمه الـ String لانشاء بها JSONArray وهكذا حصلنا على JSONArray الخاصه بالرد من الموقع HttpResponse httpResponse = httpClient.execute(httpGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == 200) { HttpEntity httpEntity = httpResponse.getEntity(); String jsonData = EntityUtils.toString(httpEntity); return new JSONArray(jsonData); } لكى نحصل على تنفيذ الداله السابقه لابد من استخدام فئة ترث من الـ AsyncTask وهى اللى تجعل التطبيق يقوم بعمل اشياء فى الـBackground وبعد ان يفرغ يقوم بتنفيذ حدث معين او عرض البيانات فى الشاشه لماذا سوف نستخدم ذلك لان الحصول على البيانات من الموقع يستغرق وقت فى ذلك لذلك قومنا ببناء الفئة ReadJSONTwitterData والتى ترث من الفئة AsyncTask ليكون بالشكل التالى class ReadJSONTwitterData extends AsyncTask<String, Integer, UserTweets[]> { @Override protected UserTweets[] doInBackground(String... params) { } @Override protected void onPostExecute(UserTweets[] twittes) { } } لكن ماذا عن String , Integer , UserTweets[] اول مدخل String وهو يحدد نوع المدخلات للداله doInBackground ثانى مدخل Integer وهو يحدد قيمه الـ progress وقد تستخدم فى عمل شكل ProgressBar وتحديث القيمه بداخله بهذه القيمه ثالث مدخل وهو ما يحدد نتيجه الداله doInBackground ومدخلات الداله onPostExecute ماذا عن الداله doInBackground هى من تقوم بفعل الاتصال والحصول على البيانات فى خلفيه البرنامج ماذا عن الداله onPostExecute هى ما تستدعى عندما تفرغ الداله doInBackground من الحصول على البيانات او فعل الاوامر ولاستدعاء هذه الفئة نقوم new ReadJSONTwitterData().execute(KEYS); ونعطى الداله execute جميع المدخلات التى نريدها وهى هنا عباره عن مصفوفه من النوع String private String[] KEYS = new String[] { "text", "created_at", "user","screen_name", "name" }; حيث ان text هو يمثل مفتاح للحصول على نص التدوينه created_at وهو ايضا مفتاح للحصول على تاريخ التدوينه user وهى مفتاح ولكنه يمثل كائن كامل من البيانات screen_name وهو مفتاح يعبر عن اسم المستخدم على التويتر name وهو عباره عن مفتاح يمثل الاسم الكامل للشخص على التويتر @Override protected UserTweets[] doInBackground(String... params) { try { JSONArray jsonArr = getUserTwittes(username); if (jsonArr != null) { UserTweets uts[] = new UserTweets[jsonArr.length()]; for (int i = 0; i < uts.length; i++) { JSONObject ob = jsonArr.getJSONObject(i); String text = ob.getString(params[0]); String date = ob.getString(params[1]); ob = jsonArr.getJSONObject(i).getJSONObject(params[2]); String username = ob.getString(params[3]); String name = ob.getString(params[4]); date = new SimpleDateFormat("EEE, MMMM dd, yyyy hh:mm:ss a") .format(Date.parse(date)); UserTweets ut = new UserTweets(text, date, username, name); uts[i] = ut; } return uts; } else { return null; } } catch (Exception e) { e.printStackTrace(); } return null; } نقوم باستدعاء الدالة getUserTwittes داخل الـdoInBackground وبعدها تعود لنا الـJSONArray نقوم تفحص هل تحتوى على بيانات ام هى null ومن ثم نقوم بعمل مصفوفه على حسب عدد التدوينات وهى طول الJSONArray UserTweets uts[] = new UserTweets[jsonArr.length()]; ونقوم بعمل لووب على عدد التدوينات JSONObject ob = jsonArr.getJSONObject(i); String text = ob.getString(params[0]); String date = ob.getString(params[1]); نقوم باخد الـgetJSONObject من المصفوفه الخاصه بالـ jsonArr وبم انها مصفوفه اساسية نقوم باخد قيمه الـ text , created_at بكل سهولة لكن بالنسبه الخاصه بالمستخدم فى بيانات داخل كائن user فلذلك لا يمكن الحصول عليها بسهوله كما حصلت على نص وتاريخ التدوينه سوف نقوم بالدخول على الكائن user الاول وبعدها نقوم بالحصول على البيانات الخاصه به مثل الـ name , screen_name ob = jsonArr.getJSONObject(i).getJSONObject(params[2]); String username = ob.getString(params[3]); String name = ob.getString(params[4]); وبعدها نقوم بعمل كائن جديد من الـ UserTweets ووضعه فى مصفوفة الـ uts بعد ان تقوم هذه الداله بانهاء العمل يتم استدعاء الداله onPostExecute وهى ما تاخد فى مدخلاتها مصفوفه من الـ UserTweets يتم ارساله مباشره فور الانتهاء من العمل بالداله doInBackground وهى التى تقوم بفحص البيانات داخل المصفوفه هل تحتوى على بيانات ام null ومن ثم تعرض رساله خطأ او ترسل البيانات لداله تقوم ببناء البيانات داخل الـ ListView فهى هذه المره سوف نقوم ببناء الـ Custom Adapter الخاص بالـ listView لاننا نريد ان تظهر بشكل افضل لذلك سوف نستخدم الـ SimpleAdapter لعمل ذلك وهو ما ياخد الـ Context وبعدها list ولكنها عباره عن Hashmap من القيم التى سوف يعمل بينها تواصل لوضعها فى مكانها الصحيح وبعدها شكل العنصر فى الـ listview هو عباره عن شكل XML تم بناءه عباره عن 3 TextView بشكل جمالى وبعد ذلك مصفوفه من الـ String تحتوى على الـمفاتيح المستخدمة فى الـ Hashmap وبعدها مصفوفه من الـ int تحتوى على ids الخاصه بالمكونات الموجود فى الـ View وهذه هى الداله التى تقوم بذلك private void setDataToList(UserTweets tweets[]) { List<HashMap<String, String>> maps = new ArrayList<HashMap<String, String>>(); for (int i = 0; i < tweets.length; i++) { HashMap<String, String> hm = new HashMap<String, String>(); hm.put(KEYS[0], tweets[i].getText()); hm.put(KEYS[1], tweets[i].getDate() + "\n"); hm.put(KEYS[2], tweets[i].getScreenName() + "(" + tweets[i].getUserName() + ")"); maps.add(hm); } simpleAdapter = new SimpleAdapter(this, maps, R.layout.item_tweet_list, new String[] { KEYS[0], KEYS[1], KEYS[2] }, new int[] { R.id.tv_tweet_text, R.id.tv_tweet_date, R.id.tv_user_info }); tweetsListView.setAdapter(simpleAdapter); } وهذا هو الكود كاملا package com.jkelany.json; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; public class JSONTwitterActivity extends Activity { private String username = "jkelanycompany"; private final String TWITTER_API_URL = "https://api.twitter.com/1/statuses/user_timeline.json?"; private ListView tweetsListView; private TextView twittesTextView; private HttpClient httpClient; private SimpleAdapter simpleAdapter; private String[] KEYS = new String[] { "text", "created_at", "user", "screen_name", "name" }; private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); twittesTextView = (TextView) findViewById(R.id.tv_no_tweets); tweetsListView = (ListView) findViewById(R.id.lv_tweets); showLoadingDialog(); httpClient = new DefaultHttpClient(); new ReadJSONTwitterData().execute(KEYS); } private void showLoadingDialog() { progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false); progressDialog.setMessage("Loading '" + username + "' tweets..."); progressDialog.show(); } public JSONArray getUserTwittes(String username) throws ClientProtocolException, IOException, JSONException { StringBuilder sb = new StringBuilder(TWITTER_API_URL); sb.append("screen_name="); sb.append(username); HttpGet httpGet = new HttpGet(sb.toString()); HttpResponse httpResponse = httpClient.execute(httpGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == 200) { HttpEntity httpEntity = httpResponse.getEntity(); String jsonData = EntityUtils.toString(httpEntity); return new JSONArray(jsonData); } return null; } class ReadJSONTwitterData extends AsyncTask<String, Integer, UserTweets[]> { @Override protected UserTweets[] doInBackground(String... params) { try { JSONArray jsonArr = getUserTwittes(username); if (jsonArr != null) { UserTweets uts[] = new UserTweets[jsonArr.length()]; for (int i = 0; i < uts.length; i++) { JSONObject ob = jsonArr.getJSONObject(i); String text = ob.getString(params[0]); String date = ob.getString(params[1]); ob = jsonArr.getJSONObject(i).getJSONObject(params[2]); String username = ob.getString(params[3]); String name = ob.getString(params[4]); date = new SimpleDateFormat("EEE, MMMM dd, yyyy hh:mm:ss a") .format(Date.parse(date)); UserTweets ut = new UserTweets(text, date, username, name); uts[i] = ut; } return uts; } else { return null; } } catch (Exception e) { e.printStackTrace(); twittesTextView.setText(e.getMessage()); twittesTextView.setVisibility(View.VISIBLE); progressDialog.dismiss(); } return null; } @Override protected void onPostExecute(UserTweets[] twittes) { if (twittes == null) { twittesTextView.setVisibility(View.VISIBLE); twittesTextView .setText("'" + username + "' may be not have tweets\nor may be not a twitter user."); progressDialog.dismiss(); } else { setDataToList(twittes); } } } private void setDataToList(UserTweets tweets[]) { List<HashMap<String, String>> maps = new ArrayList<HashMap<String, String>>(); for (int i = 0; i < tweets.length; i++) { HashMap<String, String> hm = new HashMap<String, String>(); hm.put(KEYS[0], tweets[i].getText()); hm.put(KEYS[1], tweets[i].getDate() + "\n"); hm.put(KEYS[2], tweets[i].getScreenName() + "(" + tweets[i].getUserName() + ")"); maps.add(hm); } simpleAdapter = new SimpleAdapter(this, maps, R.layout.item_tweet_list, new String[] { KEYS[0], KEYS[1], KEYS[2] }, new int[] { R.id.tv_tweet_text, R.id.tv_tweet_date, R.id.tv_user_info }); tweetsListView.setAdapter(simpleAdapter); progressDialog.dismiss(); } } صور من عمل التطبيق لتحميل الكود TestJSONwithTwitter.zip بالتوفيق ان شاء الله
  15. الى خبراء جوجل بلاي

    وعليكم السلام يمكنك رفع تطبيقاتك علي جوجل بلاي انا بمصر وارفع ما في مشكله
  16. استيراد قاعدة بيانات خارجية

    عن طريق وضعها في مجلد ال assets اقرا هذه الطريقه   http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
  17. انا ايضا يمكنني رفعه لك بعد فحص التطبيق راسلني اذا ما عندك مانع
  18. داخل كود ال php قبل التعديل والاضافه ضعي هذا السطر query("SET NAMES utf8"); ومن ناحيه كود الاندرويد في عمليه الاتصال لابد وان يكون هكذا form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");بالتوفيق
  19. ما هي نوعيه التطبيق ونوعيه التنبيهات اللي تريد ارسالها ؟ وهل هناك عمليه تسجيل داخل التطبيق حقك؟
  20. مشكلة بالتحويل من List الى Set

      ما المشكله اذن بامكانك ان تقوم بعمل ذلك من الHashMap وتحصل علي ArrayList بكل سهوله ما ادري ايش المشكله اذن؟
  21. مشكلة بالتحويل من List الى Set

    هذا حل اخر باستخدام الـ HashMap وليس الـ Set يفى بالغرض يعتبر ان المفتاح الاساسى هو CD_ID import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;public class Excel2DB {    public static void main(String[] args) throws Exception {        HashMap<String, ArrayList> dataMap = readExcelFile();        for (Map.Entry<String, ArrayList> entry : dataMap.entrySet()) {            String key = entry.getKey();            ArrayList list = entry.getValue();            System.out.println(key + " -> " + list.toString());        }    }    public static HashMap<String, ArrayList> readExcelFile() {        HashMap<String, ArrayList> dataMap = new HashMap<String, ArrayList>();        try {            FileInputStream file = new FileInputStream(new File("D:/Songs.xls"));            //Get the workbook instance for XLS file            HSSFWorkbook workbook = new HSSFWorkbook(file);            //Get first sheet from the workbook            HSSFSheet sheet = workbook.getSheetAt(0);            //Iterate through each rows from first sheet            Iterator<Row> rowIterator = sheet.iterator();            while (rowIterator.hasNext()) {                Row row = rowIterator.next();                //display from the first row                if (row.getRowNum() > 0) {                    Cell firstCell = null;                    //For each row, iterate through each columns                    Iterator<Cell> cellIterator = row.cellIterator();                    ArrayList data = new ArrayList();                    while (cellIterator.hasNext()) {                        //Getting the cell contents                        Cell cell = cellIterator.next();                        if (firstCell == null) {                            firstCell = cell;                        }                        data.add(cell);                    }                    dataMap.put(firstCell.toString(), data);                }            }        } catch (Exception e) {            e.printStackTrace();        }        return dataMap;    }}
  22. المساعده ياخوان (تخزين البيانات تلقائيا)

    لديك العديد من المواضيع هنا بهذا الموضوع فالمنتدي http://arabteam2000-forum.com/index.php/topic/142086-%D8%AF%D8%B1%D9%88%D8%B3-%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D9%85%D9%88%D8%A7%D8%B6%D9%8A%D8%B9-%D9%85%D9%85%D9%8A%D8%B2%D8%A9/   وهي :   دروس قواعد البيانات: خطوات ربط الجافا بـ SQL Server الدرس الاول من دروس Hibernate قواعد البيانات و الـPersistence دروس في الـ Hibernate باستخدام MySQL , Eclipse شرح : كيفية الاتصال بقاعدة بيانات أكسيس وإضافة بيانات اليها مثال لكيفية تخزين الملفات في قاعدة البيانات واسترجاعها قاعدة بيانات SQLite قاعدة بيانات MySQL: درس حول الأتصال بقاعدة البيانات Mysql كيفيه انشاء مشروع باستخدام MySQL ارتباطا مع الجافا
  23. هذا مثال ابسيط ما ادرى كيف ابسطه اكثر من ذلك
  24. تفضل هذا سوف يساعدك   http://arabteam2000-forum.com/index.php/topic/278921-%D8%A7%D8%B1%D8%AC%D9%88-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B9%D8%AF%D8%A9-%D9%81%D9%89-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%80-mysql/?p=1344551
  25. وعليكم السلام ما ينفع تعمل هيك