স্ক্লাইট থেকে শেষ রেকর্ড কিভাবে পাবেন?


96

আমার একটি টেবিল question_tableএবং একটি ImageButton( পিছনে ) রয়েছে। পিছনে ক্লিক করার পরে ডাটাবেস থেকে আমার সর্বশেষ recordোকানো রেকর্ডটি পাওয়া দরকার ।

আমার সারি নিম্নলিখিত কলাম উপস্থিত থাকে: question, optionA, optionB, optionC, optionD, এবং আমি ব্যবহারের জন্য তথ্য আমার দরকার Activity। আমি ডাটাবেসে একটি পদ্ধতি তৈরি করি তবে এটি কার্যকর হয় না।

রেফারেন্সের জন্য কোড এখানে:

MySQLiteHelper.java এক্সট্র্যাক্ট:

public List<ObjectiveWiseQuestion> getLastInsertQuestion()
{
    // long index = 0;
    List<ObjectiveWiseQuestion>LocwiseProfileList=new ArrayList<ObjectiveWiseQuestion>();
    db = getReadableDatabase();
    Cursor cursor = db.query(
            "sqlite_sequence",
            new String[]{"seq"},
            "name = ?",
            new String[]{TABLE_QUESTION},
            null,
            null,
            null,
            null );

    if (cursor.moveToFirst())
    {
        do {
            ObjectiveWiseQuestion owq= new ObjectiveWiseQuestion();

            owq.setQuestion(cursor.getString(2));
            owq.setOptionA(cursor.getString(3));
            owq.setOptionB(cursor.getString(4));
            owq.setOptionC(cursor.getString(5));
            owq.setOptionD(cursor.getString(6));
            owq.setCorrectOption(cursor.getString(7));
            LocwiseProfileList.add(owq);
        } while(cursor.moveToNext());

        db.close();
    }

    return LocwiseProfileList;
}

OnClickListnerঅ্যাডকুইশনএকটিভিটি.জভা থেকে

imgBack.setOnClickListener( new View.OnClickListener() 
{                       
    @Override
    public void onClick(View v) 
    {
        msg();
        emptyFormField();

        try {
            final List<ObjectiveWiseQuestion> LocWiseProfile =  db.getLastInsertQuestion();       

            for (final ObjectiveWiseQuestion cn : LocWiseProfile)
            {   
                db=new MySQLiteHelper(getBaseContext());
                db.getWritableDatabase();
                txtQuestion.setText(cn.getQuestion());
                txtOptionA.setText(cn.getOptionA());
                txtOptionB.setText(cn.getOptionB());
                txtOptionC.setText(cn.getOptionC());
                txtOptionD.setText(cn.getOptionD());
                txtCorrectOption.setText(cn.getCorrectOption());
                db.close();
            }
        } catch(Exception e) {
            e.printStackTrace();
        }           
    }
});

দয়া করে আমাকে কিছু ইঙ্গিত দিন।

উত্তর:


188

এটা চেষ্টা কর:

SELECT * 
    FROM    TABLE
    WHERE   ID = (SELECT MAX(ID)  FROM TABLE);

বা

আপনি নিম্নলিখিত সমাধান ব্যবহার করতে পারেন:

SELECT * FROM tablename ORDER BY column DESC LIMIT 1;

25
এটি সেই উদ্দেশ্যে খুব খারাপ অনুরোধ কারণ sqliteফলাফলটি ফেরত দেওয়ার আগে তাদের আইডি দিয়ে ধীরে ধীরে সমস্ত রেকর্ড বাছাই করা উচিত, স্টিফেন এনগুইন DESCএবংLIMIT 1
আর্টেম জিনাতুল্লিন

@ হাসমুখ হাই গোবিন্দ এখানে .. নীচের কোণায় ডানদিকে স্যাটেলাইটেমেনু করতে চান ... আপনি কি এটা করেছেন ..?
গোবিন্দ রাঠোদ

@ গোবিন্দ এখানে রেফারেন্স লিঙ্ক, এটি আপনাকে সহায়তা করতে পারে, github.com/siyamed/android-s مصنوعي-menu
হাসমুখ

@ হাসমুখ, যদি ধরা যাক যে কলাম আইডিটি কেবল 'স্বতঃআগ্রহ' নয় তবে অন্য কিছু অনন্য ... এখনও এই সমাধানটি চালাচ্ছে?
চোলতস্কি

4
এই এবং অন্যান্য উত্তরগুলির কাছে একটি অস্তিত্বহীন অনুমান রয়েছে যে তারা যে কলামটি বাছাই করছে তা সর্বদা বাড়ছে। এটি স্বতঃসিদ্ধকরণ কলামগুলির ক্ষেত্রে সত্য, তবে প্রতিটি টেবিলের মতো কলাম থাকে না।
লার্শ

206

আমি মনে করি শীর্ষ উত্তরটি কিছুটা ভার্বোস, কেবল এটি ব্যবহার করুন

SELECT * FROM table ORDER BY column DESC LIMIT 1;

4
"শীর্ষ উত্তর" সর্বদা শীর্ষের উত্তর থেকে যায় না। আপনারা কি হাসমখের?
লার্শ

কখনও কখনও এটি কোনও অজানা কারণে দ্বিতীয়-সর্বশেষ মান দেয় ... বেশিরভাগ সময় এটি
ঠিকঠাকভাবে

যদি কলামটি স্বতঃসীমা চিহ্নিত করা থাকে তবে নির্বাচন করুন ম্যাক্স (আইডি) আরও ভাল। সিএলআই ব্যবহার করে 'এক্সপ্ল্লেইন QUERY প্ল্যান <ক্যুরি>' আপনার ক্যোয়ারীর ফলাফলগুলি একটি পূর্ণ টেবিল স্ক্যানের ফলস্বরূপ, যেখানে নির্বাচন করুন ম্যাক্স (আইডি) আরও দ্রুত অনুসন্ধানে আসে।
ব্রায়ান হেইলিগ

23

আপনার টেবিল থেকে সর্বশেষ রেকর্ড পেতে ..

 String selectQuery = "SELECT  * FROM " + "sqlite_sequence";
 Cursor cursor = db.rawQuery(selectQuery, null);
  cursor.moveToLast();


@ এফহোকে তার WHERE = TABLE_NAME দরকার নেই কারণ "স্ক্লাইট_সেক্সেন্স" হল সারণী উল্লেখ।
apkisbossin

আমি কোনও গ্যারান্টি জানি না যে একটি অমীমাংসিত ক্যোয়ারির সর্বশেষ রেকর্ডটি সারণির শেষ রেকর্ড হবে। আমি বাজি ধরছি এটি "প্রায়শই" কাজ করে। আপনি যদিও এটির উপর নির্ভর করতে পারবেন না।
Anders8

13

এখানে একটি সাধারণ উদাহরণ যা কোনও কলাম থেকে কিছু সাজানোর প্রয়োজন ছাড়াই কেবল শেষ পংক্তিটি দেয়:

"SELECT * FROM TableName ORDER BY rowid DESC LIMIT 1;"       

9

আমি মনে করি আপনি পুরো এসকিউএল স্ট্রিংয়ের পরিবর্তে এসকিউএলডিটাবেস ক্লাস থেকে পদ্ধতি কোয়েরিটি ব্যবহার করেন তবে এটি আরও ভাল হবে:

 Cursor cursor = sqLiteDatabase.query(TABLE, allColluns, null, null, null, null, ID +" DESC", "1");

শেষ দুটি প্যারামিটারগুলি অর্ডার বাই এবং লিমিট IMIT

আপনি এখানে আরও দেখতে পারেন: http://developer.android.com/references/android/datedia/sqlite/SQLiteDatabase.html


8

আপনি যদি ইতিমধ্যে কার্সার পেয়ে থাকেন, তবে আপনি এভাবে কার্সার থেকে সর্বশেষ রেকর্ডটি পেতে পারেন:

cursor.moveToPosition(cursor.getCount() - 1);
//then use cursor to read values

getContentResolver ()। কোয়েরিতে কার্সার তৈরির মাধ্যমে এটি পাওয়ার কী উপায় আছে?
রাল্ফগ্যাব

আপনি কেবল কার্সার.মোভটোলস্ট () ব্যবহার করতে পারেন;
অনন্ত শাহ

2

ধরুন আপনি টেবিলের শেষ সারিটি dbstr.TABNAME সন্ধান করছেন, "_ID" নামে উদাহরণস্বরূপ একটি INTEGER কলামে (উদাহরণস্বরূপ বেসকলামস __আইডি), তবে আপনি চাইলে অন্য কলাম হতে পারে।

public int getLastId() {
    int _id = 0;
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    Cursor cursor = db.query(dbstr.TABNAME, new String[] {BaseColumns._ID}, null, null, null, null, null);

    if (cursor.moveToLast()) {
        _id = cursor.getInt(0);
    }

    cursor.close();
    db.close();
    return _id;
}

2

সহজ সরল, আপনি Cursor মুভিটোলাস্ট () দিয়ে সরাতে পারবেন ; পদ্ধতিটি সর্বশেষ রেকর্ডে স্থানান্তরিত করে

cursor.moveToLast();

2

আমি এক সারি টেনে টেবিলটি বজায় রাখতে চেয়েছিলাম যা টেবিলের একটি নির্দিষ্ট কলামে আমাকে শেষ মান দেয়। আমি মূলত এক্সেলের মধ্যে LAST()ফাংশনটি প্রতিস্থাপন করতে চেয়েছিলাম এবং এটি কাজ করেছিল।

, (Select column_name FROM report WHERE rowid = (select last_insert_rowid() from report))

1

অন্য বিকল্পটি LAST_VALUE()নিম্নলিখিত উপায়ে এসকিউএলাইটস ফাংশনটি ব্যবহার করা ।

এই টেবিল দেওয়া:

+--------+---------+-------+
| OBJECT |  STATUS |  TIME |
+--------+---------+-------+
|        |         |       |
| 1      |  ON     |  100  |
|        |         |       |
| 1      |  OFF    |  102  |
|        |         |       |
| 1      |  ON     |  103  |
|        |         |       |
| 2      |  ON     |  101  |
|        |         |       |
| 2      |  OFF    |  102  |
|        |         |       |
| 2      |  ON     |  103  |
|        |         |       |
| 3      |  OFF    |  102  |
|        |         |       |
| 3      |  ON     |  103  |
+--------+---------+-------+

আপনি নিম্নলিখিত প্রশ্নের সাথে প্রতিটি বস্তুর শেষ স্থিতি পেতে পারেন

SELECT                           
    DISTINCT OBJECT,             -- Only unique rows
    LAST_VALUE(STATUS) OVER (    -- The last value of the status column
        PARTITION BY OBJECT      -- Taking into account rows with the same value in the object column
        ORDER by time asc        -- "Last" when sorting the rows of every object by the time column in ascending order
        RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING    -- Take all rows in the patition
    ) as lastStatus
FROM
    TABLE

ফলাফলটি দেখতে এমন হবে:

+--------+--------------+
| OBJECT |  LAST_STATUS |
+--------+--------------+
|        |              |
| 1      |  ON          |
|        |              |
| 2      |  ON          |
|        |              |
| 3      |  ON          |
+--------+--------------+

0

স্ক্লাইটে, স্ক্লাইট_সেক্সেন্স নামে একটি টেবিল রয়েছে, এই টেবিলটিতে সারণির নাম রয়েছে এবং এটি শেষ আইডি নম্বর (যদি আইডিটি স্বয়ংক্রিয়ভাবে বর্ধিত হয়)।

সুতরাং, একটি সারণীতে শেষ সারিটি পেতে কেবল লিখুন:

Select * from TABLENAME where id=(SELECT * from sqlite_sequence where name ='TABLENAME')

0

পূর্ববর্তী উত্তর অনুমান একটি নেই বৃদ্ধিশীল পূর্ণসংখ্যা আইডি কলাম, তাই MAX(ID)শেষ সারি দেয়। তবে কখনও কখনও কীগুলি পাঠ্য প্রকারের হয় , অনুমানযোগ্য পদ্ধতিতে অর্ডার করা হয় না not সুতরাং সর্বশেষ 1 বা N সারিগুলি (# ন্যারো #) নেওয়ার জন্য আমরা একটি ভিন্ন পদ্ধতির অনুসরণ করতে পারি :

Select * From [#TableName#]  LIMIT #Nrows# offset cast((SELECT count(*)  FROM [#TableName#]) AS INT)- #Nrows#
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.