# SQLite डेटाबेस कैसे खोलें या बनाएँ

> try-with-resources के साथ एक .db फ़ाइल खोलें/बनाएँ, इन-मेमोरी डेटाबेस उपयोग करें और टेबल बनाएँ।

Source: https://crossfly.dev/hi/docs/cookbook/data/abrir-banco — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# SQLite डेटाबेस कैसे खोलें या बनाएँ

**उद्देश्य.** एक SQLite डेटाबेस खोलना (या यदि मौजूद न हो तो बनाना) और उसकी टेबल बनाना। CrossFly में प्रवेश द्वार `SqliteDb` है, एक `AutoCloseable` हैंडल — नेटिव कनेक्शन के बंद होने की गारंटी के लिए हमेशा `try (...)` उपयोग करें।

## उपयोग किए गए APIs
- `SqliteDb.open(String filename)` — read/write में एक **अनएन्क्रिप्टेड** डेटाबेस खोलता/बनाता है (`OPEN_DEFAULT = OPEN_READWRITE | OPEN_CREATE`)। एक `SqliteDb` लौटाता है।
- `SqliteDb.openMemory()` — एक **इन-मेमोरी** डेटाबेस (`:memory:`) खोलता है, अस्थिर: बंद होने पर गायब हो जाता है। परीक्षण और अस्थायी कैश के लिए आदर्श।
- `SqliteDb.exec(String sql)` — एक या अधिक निर्देश **बिना परिणाम के** चलाता है (DDL, PRAGMA, बैच DML)। `CREATE TABLE`, `CREATE INDEX`, `PRAGMA ...` के लिए उपयोग करें। त्रुटि पर `SqliteException` फेंकता है।
- `SqliteDb.close()` — नेटिव कनेक्शन बंद करता है। **Idempotent** (दो बार कॉल करना सुरक्षित है)। `try-with-resources` इसे स्वचालित रूप से कॉल करता है।
- `SqliteDb.version()` — SQLite लाइब्रेरी की संस्करण स्ट्रिंग लौटाता है (डायग्नोस्टिक्स के लिए उपयोगी)।

> **फ़ाइल पथ.** एक लिखने-योग्य फ़ाइल पथ पास करें (प्लेटफ़ॉर्म के अनुसार)। यहाँ किसी भी चीज़ के लिए `Gdx.graphics` का उपयोग न करें; SQLite UI से स्वतंत्र है। प्लेटफ़ॉर्म-अनुसार फ़ाइल स्थान के लिए, storage गाइड देखें।

## पूरा उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

```java
package com.exemplo;

import dev.crossfly.ui.*;                     // Window
import dev.crossfly.ui.layout.*;             // VerticalLayout
import dev.crossfly.sqlite.*;                // SqliteDb, SqliteException

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // 1) फ़ाइल में डेटाबेस (यदि मौजूद नहीं तो बनाया गया)
      try (SqliteDb db = SqliteDb.open("app.db"))
      {
         db.exec(
            "CREATE TABLE IF NOT EXISTS person(" +
            "  id   INTEGER PRIMARY KEY," +
            "  name TEXT NOT NULL," +
            "  age  INTEGER)");
         // ... यहाँ डेटाबेस का उपयोग करें ...
      }
      // try से बाहर निकलते ही कनेक्शन बंद हो जाता है

      // 2) मेमोरी में डेटाबेस (अस्थिर) — परीक्षण के लिए अच्छा
      try (SqliteDb mem = SqliteDb.openMemory())
      {
         mem.exec("CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT)");
         // ... केवल तब तक जीवित रहता है जब तक 'mem' खुला है ...
      }
   }
}
```

> नीचे दिया गया अंश **केवल मुख्य भाग** दिखाता है। इसे चलाने के लिए, इसे ऊपर दिए गए `MainWindow` कंकाल में रखें।

## न्यूनतम अंश
```java
// स्रोत में सत्यापित: SqliteDb.open / openMemory / exec
import dev.crossfly.sqlite.*;

// 1) फ़ाइल में डेटाबेस (यदि मौजूद नहीं तो बनाया गया)
try (SqliteDb db = SqliteDb.open("app.db"))
{
   db.exec(
      "CREATE TABLE IF NOT EXISTS person(" +
      "  id   INTEGER PRIMARY KEY," +
      "  name TEXT NOT NULL," +
      "  age  INTEGER)");
   // ... यहाँ डेटाबेस का उपयोग करें ...
}
// try से बाहर निकलते ही कनेक्शन बंद हो जाता है

// 2) मेमोरी में डेटाबेस (अस्थिर) — परीक्षण के लिए अच्छा
try (SqliteDb mem = SqliteDb.openMemory())
{
   mem.exec("CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT)");
   // ... केवल तब तक जीवित रहता है जब तक 'mem' खुला है ...
}
```

## और गहराई से जानें
- [SQLite storage गाइड](/docs/data-and-services/storage-sqlite) · विकास गाइड
- संबंधित रेसिपी: [पैरामीटरयुक्त CRUD](/docs/cookbook/data/crud) · [एन्क्रिप्टेड डेटाबेस](/docs/cookbook/data/banco-criptografado) · [paint thread के बाहर उपयोग](/docs/cookbook/data/banco-fora-da-paint-thread)
