2015-12-30 7 views
20

मैं दो टेबल, एक Information है और अन्य है WorkForceमूल्य हमेशा 0 लौट जहां इसे वापस चाहिए पंक्ति की संख्या डाला

सूचना

enter image description here

कार्यबल

enter image description here

कार्यबल में TWF columnकी id सूचना है, जो 1 के रूप में वापसी लगता प्राप्त करने के लिए प्रयोग किया जाता है, लेकिन यह मूल्य 0. लौट idमें सूचना 5 है, तो twf भी 5 होना चाहिए।

सबसे पहले मैं चयनित पंक्ति की संख्या का प्रतिनिधित्व करने के लिए a का उपयोग करता हूं और फिर a का पैरामीटर addWorkForce में जोड़ता हूं। toast हमेशा 0 प्रदर्शित करता है।

a=addInformation(name,weather,date2,status,first1[1],last1[1]); 
    Toast.makeText(getApplicationContext(),a+"",Toast.LENGTH_LONG).show(); 
    addWorkForce(Sub, NoP, NoH,a); 

addInformation समारोह

public long addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
    { 
     class AddInfo extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       HashMap<String, String> data = new HashMap<String,String>(); 
       data.put(Config.KEY_USER_NAME,name); 
       data.put(Config.KEY_WEATHER,weather); 
       data.put(Config.KEY_DATE,date2); 
       data.put(Config.KEY_STATUS,status); 
       data.put(Config.KEY_TIMEIN,timeIn); 
       data.put(Config.KEY_TIMEOUT,timeOut); 
       RequestHandler rh=new RequestHandler(); 
       String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
       return result; 
      } 
     } 

     AddInfo ru = new AddInfo(); 
     ru.execute(name,weather,date2,status,timeIn,timeOut); 

     return 0; 

    } 

कोई मेरी मदद कर सकते समस्या यह पता लगाने के लिए?

addInformation.php

<?php 

    if($_SERVER['REQUEST_METHOD']=='POST'){ 

     //Getting values 
     $name = $_POST['name']; 
     $weather = $_POST['weather']; 
     $date = $_POST['date']; 
       $status = $_POST['status']; 
       $timeIn = $_POST['timeIn']; 
       $timeOut = $_POST['timeOut']; 

     //Creating an sql query 
     $sql = "INSERT INTO information(name, weather, date, status, time_in, time_out) VALUES ('$name','$weather','$date', '$status', '$timeIn', '$timeOut')"; 

     //Importing our db connection script 
     require_once('dbConnect.php'); 

     //Executing query to database 
     if(mysqli_query($con,$sql)){ 
      echo 'Information Added Successfully'; 
     }else{ 
      echo 'Could Not Add Information'; 
     } 

     //Closing the database 
     mysqli_close($con); 
    } 
?> 

यह कैसे मैं पंक्ति SQLite में डाला प्राप्त करने के लिए कोड का इस्तेमाल किया है और यह काम करता

a = ts.insertTimeSheet(name, weather, date2, status, first1[1], last1[1]); 

timesheet

public long insertTimeSheet(String name, String weather, String date, String status, String TimeIn, String TimeOut) { 
     database = dbHelper.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(MyDatabaseHelper.Name, name); 
     values.put(MyDatabaseHelper.Weather, weather); 
     values.put(MyDatabaseHelper.Date, date); 
     values.put(MyDatabaseHelper.Status, status); 
     values.put(MyDatabaseHelper.TimeIn_Info, TimeIn); 
     values.put(MyDatabaseHelper.TimeOut_Info, TimeOut); 
     return database.insert(MyDatabaseHelper.TABLE_INFO, null, values); // if the id in Information is 5, twf display 5 too 
+0

'echo 'जानकारी नहीं जोड़ सका'; 'आपकी क्वेरी में कोई त्रुटि होने पर यह जॉन आपकी सहायता नहीं करता है। आपको वास्तविक त्रुटि प्राप्त करने की आवश्यकता है। 'My dieqli_query() '' '' '' '' '' '' 'मरने के लिए' या die (mysqli_error ($ con)) जोड़ें। –

+0

@ फ्रेड-ii- मेरे कोड में कोई त्रुटि नहीं। मैं सिर्फ यह जानना चाहता हूं कि टेबल की पंक्ति की संख्या कैसे प्राप्त करें कार्य करने के लिए जानकारी Force –

+0

इसे कॉलम वर्कफ़ोर पर 1 वापस करना चाहिए। यदि दूसरी पंक्ति है, तो वर्कफ़ोर twf में 2 प्रदर्शित करें ... –

उत्तर

7

अपने कोड के अनुसार जानकारी जोड़ने के लिए:

a=addInformation(name,weather,date2,status,first1[1],last1[1]); 

यहाँ, आप मुख्य थ्रेड पर addInformation बुला रहे हैं और चर एक करने के लिए दिया गया मान पकड़ो। लेकिन समस्या यह है कि, जानकारी जोड़ने का आपका वास्तविक कार्यान्वयन doInBackgroundAsyncTask में किया जाता है जो वास्तव में कार्यकर्ता थ्रेड (एसिंक कॉल) पर नौकरी करता है और इसलिए आपको हमेशा एक = 0 (लंबे समय तक) के लिए डिफ़ॉल्ट मान प्राप्त होगा।

आप क्या करने की जरूरत नीचे की तरह AsyncTask की onPostExecute समारोह के लिए अपने कोड ले जाने के लिए है:

public void addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
    { 
     class AddInfo extends AsyncTask<String, Void, String> { 
      ProgressDialog loading; 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
       loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       loading.dismiss(); 
       Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
       addWorkForce(Sub, NoP, NoH,a); 
      } 

      @Override 
      protected String doInBackground(String... params) { 

       HashMap<String, String> data = new HashMap<String,String>(); 
       data.put(Config.KEY_USER_NAME,name); 
       data.put(Config.KEY_WEATHER,weather); 
       data.put(Config.KEY_DATE,date2); 
       data.put(Config.KEY_STATUS,status); 
       data.put(Config.KEY_TIMEIN,timeIn); 
       data.put(Config.KEY_TIMEOUT,timeOut); 
       RequestHandler rh=new RequestHandler(); 
       String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
       return result; 
      } 
     } 

     AddInfo ru = new AddInfo(); 
     ru.execute(name,weather,date2,status,timeIn,timeOut); 

    } 

एक और दृष्टिकोण कॉलबैक उपयोग करने के लिए है। एक इंटरफेस लागू करें और अपने AsyncTask के पूरा होने के बाद, आप एक और नौकरी करने के लिए कॉलबैक भेज सकते हैं।

+0

सही उत्तर प्राप्त करता है :) –

4

मुझे विश्वास है क्या इस मुद्दे से

return 0; 

आपकी एडॉन्फोर्मेशन विधि हर समय 0 के मान के साथ एक लंबा समय लौटाती है। यदि आप इसे किसी अन्य नंबर को वापस करना चाहते हैं तो आपको उस पंक्ति को बदलने की आवश्यकता होगी।

संपादित करें: अपने पंक्ति का ट्रैक रखने के लिए, अपने विधि शीर्षक के दूसरा पैरामीटर जोड़ें

public long addInformation(int rowId, final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
+0

को पूरा करने से पहले '0' के रूप में मूल्य लौटा रहा है, मुझे किस मूल्य का उपयोग करना चाहिए? –

+0

जो भी मूल्य आप इसे वापस करने की उम्मीद कर रहे हैं। यदि आप पंक्ति की आईडी चाहते हैं, तो आपको इसे अपनी कक्षा में फ़ील्ड के रूप में जोड़ना होगा, ताकि यह आपके कन्स्ट्रक्टर का हिस्सा हो और फिर विधि के अंत में वापस आने के लिए उपयोग किया जा सके। – bhooks

+0

'विदेशी कुंजी' के रूप में twf बनाते हैं? –

4

आप पंक्ति पहले table.that में डाला के बाद lastInsertId() mysql समारोह का उपयोग कर सकते है (सूचना) कुछ चर में lastInsertId() का मान संग्रहीत करें और उस समय उस चर का उपयोग करें जब आप अगली तालिका में पंक्ति डालते हैं।कि (कार्यबल)

+0

क्या आप और विस्तार कर सकते हैं? –

4

AsyncTask के बाद से एक अतुल्यकालिक काम है अपने addInformation विधि में return 0; लाइन हमेशा पहले आता है यही कारण है कि आप 0 के बजायमिला "डाला पंक्ति की संख्या" है,,।

आपको अपना कोड निम्नलिखित के रूप में अपडेट करना चाहिए, कृपया मेरी टिप्पणी // MOVE addWorkForce HERE पर ध्यान दें।

public void addInformation(final String name, final String weather, final String date2, final String status, final String timeIn, final String timeOut) 
{ 
    class AddInfo extends AsyncTask<String, Void, String> { 
     ProgressDialog loading; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      loading = ProgressDialog.show(WorkDetailsTable.this, "Please Wait",null, true, true); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      loading.dismiss(); 
      Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show(); 
      addWorkForce(Sub, NoP, NoH, Long.parseLong(s)); // MOVE addWorkForce HERE 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      HashMap<String, String> data = new HashMap<String,String>(); 
      data.put(Config.KEY_USER_NAME,name); 
      data.put(Config.KEY_WEATHER,weather); 
      data.put(Config.KEY_DATE,date2); 
      data.put(Config.KEY_STATUS,status); 
      data.put(Config.KEY_TIMEIN,timeIn); 
      data.put(Config.KEY_TIMEOUT,timeOut); 
      RequestHandler rh=new RequestHandler(); 
      String result = rh.sendPostRequest(Config.ADD_INFORMATION,data); 
      return result; 
     } 
    } 

    AddInfo ru = new AddInfo(); 
    ru.execute(name,weather,date2,status,timeIn,timeOut); 
} 

उसके बाद, आप केवल

addInformation(name,weather,date2,status,first1[1],last1[1]);

बेशक

कॉल करने के लिए, सुनिश्चित करें कि Sub, NoP, NoH चर AddInfo वर्ग के अंदर जाया जा सकता है बनाने की जरूरत है।

उम्मीद है कि यह मदद करता है!

+0

तो 'a' के बजाय' s' का उपयोग करें? –

+0

हां, क्योंकि 'वापसी परिणाम' ''InInBackground' के अंदर 'onPostExecute' के अंदर होगा' :) – BNK

+0

आप http://developer.android.com/reference/android/os/AsyncTask.html पर और अधिक पढ़ सकते हैं, AsyncTask – BNK

संबंधित मुद्दे